项目中 需要调东华提供的webservice,调webservice需要加密,静态调用需要生成一堆代码,我们项目只用其中几个接口,实现体检预约等,所以选了CXF动态客户端调用webservice的方式.核心代码如下:
TJWebServiceClient.java
public static String callWebService(String methodname, String requestCode, String quesXml){
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf
.createClient("http://10.xx.xx.xx/dthealth/web/DHCPE.Service.NetComService.cls?wsdl=1&CacheUserName=dhuser&CachePassword=dhpassword&CacheNoRedirect=1");
// url为调用webService的wsdl地址
// 需要密码的情况需要加上用户名和密码
// client.getOutInterceptors().add(new ClientLoginInterceptor("dhuser","dhuser"));
Map props = new HashMap();
props.put(WSHandlerConstants.ACTION, WSHandlerConstants.USERNAME_TOKEN);
//密码类型 明文:PasswordText密文:PasswordDigest
props.put(WSHandlerConstants.PASSWORD_TYPE, WSConstants.PW_TEXT);
//用户名
props.put(WSHandlerConstants.USER, "dhwebservice");
//将PasswordHandler 的类名传递给服务器,相当于传递了密码给服务器
props.put(WSHandlerConstants.PW_CALLBACK_CLASS, PasswordHandler.class.getName());
WSS4JOutInterceptor wssOut = new WSS4JOutInterceptor(props);
client.getOutInterceptors().add(wssOut);
// paramvalue为参数值:nb ,即是该方法需要提供的参数
Object[] objects;
try {
objects = client.invoke(methodname, requestCode,quesXml);
String objStr = objects[0].toString();
// System.out.println(objStr);
return objStr;
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
public static T getWSResponseResult(String methodname,String requestCode,Object obj,Class c) throws Exception {
if(StringUtils.isBlank(methodname))
{//默认新方法
methodname = "RequestSubmitNew";
}
String requestXml = JaxbUtil.bean2Xml(obj,obj.getClass());
// System.out.println(requestCode + " 请求报文:" + requestXml);
String res = callWebService(methodname,requestCode,requestXml);
T t = JaxbUtil.xml2Object(res,c);
return t;
}
PasswordHandler.java
public class PasswordHandler implements CallbackHandler {
@Override
public void handle(javax.security.auth.callback.Callback[] callbacks) {
for (int i = 0; i < callbacks.length; i++) {
WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
pc.setPassword("dhpass");
}
}
}
调用:
@Override
public PackagesLevelResponseVo getPackagesLevelInfo(PackagesLevelRequestVo quesVo) {
try {
PackagesLevelResponseVo rsVo = TJWebServiceClient.getWSResponseResult("RequestSubmitNew", RequestCodeEnum.REQUEST_HS10201.key,quesVo,PackagesLevelResponseVo.class);
return rsVo;
}catch (Exception ex)
{
ex.printStackTrace();
}
return null;
}
JaxUtil.java
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import java.io.*;
import java.nio.charset.Charset;
import java.util.Map;
public class JaxbUtil {
public static String converTomXml(Object obj) {
return converToXml(obj,"UTF-8");
}
private static String converToXml(Object obj, String encoding) {
String result = null;
try {
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,true);
marshaller.setProperty(Marshaller.JAXB_ENCODING,encoding);
StringWriter writer = new StringWriter();
marshaller.marshal(obj,writer);
result =writer.toString();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
@SuppressWarnings("unchecked")
public static T converyToJavaBean(String xml,Class c){
T t = null;
try {
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller();
t = (T)unmarshaller.unmarshal(new StringReader(xml));
} catch (Exception e) {
e.printStackTrace();
}
return t;
}
public static String multilayerMapToXml(Map map, boolean isCDATA) throws UnsupportedEncodingException{
String parentName = "response";
Document doc = DocumentHelper.createDocument();
doc.addElement(parentName);
String xml = recursionMapToXml(doc.getRootElement(), parentName, map, isCDATA);
return formatXML(xml);
}
@SuppressWarnings("unchecked")
private static String recursionMapToXml(Element element, String parentName, Map map, boolean isCDATA) {
Element xmlElement = element.addElement(parentName);
map.keySet().forEach(key -> {
Object obj = map.get(key);
if (obj instanceof Map) {
recursionMapToXml(xmlElement, key, (Map)obj, isCDATA);
} else {
String value = obj == null ? "" : obj.toString();
if (isCDATA) {
xmlElement.addElement(key).addCDATA(value);
} else {
xmlElement.addElement(key).addText(value);
}
}
});
return xmlElement.asXML();
}
public static String formatXML(String xml) {
String requestXML = null;
try {
// 拿取解析器
SAXReader reader = new SAXReader();
Document document = reader.read(new StringReader(xml));
if (null != document) {
StringWriter stringWriter = new StringWriter();
// 格式化,每一级前的空格
OutputFormat format = new OutputFormat(" ", true);
// xml声明与内容是否添加空行
format.setNewLineAfterDeclaration(false);
// 是否设置xml声明头部
format.setSuppressDeclaration(false);
// 是否分行
format.setNewlines(true);
XMLWriter writer = new XMLWriter(stringWriter, format);
writer.write(document);
writer.flush();
writer.close();
requestXML = stringWriter.getBuffer().toString();
}
return requestXML;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static T xml2Object(String xmlStr, Class c)
{
try
{
JAXBContext context = JAXBContext.newInstance(c);
Unmarshaller unmarshaller = context.createUnmarshaller();
T t = (T) unmarshaller.unmarshal(new InputStreamReader(
new ByteArrayInputStream(xmlStr.getBytes()), Charset.forName("UTF-8")));
return t;
} catch (JAXBException e) { e.printStackTrace(); return null; }
}
public static String bean2Xml(Object obj, Class> model) throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(model);
Marshaller marshaller = jaxbContext.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); // 设置编码字符集
// marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); // 格式化XML输出,有分行和缩进
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, true);
// marshaller.setProperty("com.sun.xml.bind.xmlHeaders",
// "");
ByteArrayOutputStream baos = new ByteArrayOutputStream();
marshaller.marshal(obj, baos);
String xmlObj = new String(baos.toByteArray(),"UTF-8"); // 生成
return xmlObj;
}
// public static String json2Xml(String json){
// String xml = "";
// try {
// org.json.JSONObject json1 = new org.json.JSONObject(json);
// xml += XML.toString(json1);
// xml += " ";
// }catch (Exception ex){
// ex.getStackTrace();
// }
// return xml;
//
// }
}



