公司项目要与外部的webservice对接接口,网上看过很多springboot调用webservice的帖子,经过自己成功调用,现在分享推荐cxf的调用方式。
首先在pom文件中引入cxf的包。这里用的3.1.11,springboot的版本是1.4.0
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-spring-boot-starter-jaxws</artifactId>
<version>3.1.11</version>
</dependency>
引入包后就可以直接调用了。具体调用方法如下:
JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient(url);
// 需要密码的情况需要加上用户名和密码
client.getOutInterceptors().add(new ClientLoginInterceptor(userNmae,pwd));
Object[] objects = new Object[0];
try {
// invoke("方法名",参数1,参数2,参数3....);
objects = client.invoke("bph_data_exchange",param,xml);
String str = objects[0].toString();
System.out.println(str);
这里的url是webservice是wsdl地址,如果需要验证用户名和密码,需要设置安全验证拦截器,
拦截器内容如下:
import java.util.List;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* 类说明
* 用于調用webservices接口的安全验证拦截器
* @author kim
* @createDate 2017-10-20 下午8:53:16
* @version V1.0
*/
public class ClientLoginInterceptor extends AbstractPhaseInterceptor<SoapMessage>
{
public ClientLoginInterceptor(String UserName, String UserPass)
{
super(Phase.PREPARE_SEND);
this.UserName = UserName;
this.UserPass = UserPass;
}
private String UserName;
private String UserPass;
public String getUserName() {
return UserName;
}
public void setUserName(String userName) {
UserName = userName;
}
public String getUserPass() {
return UserPass;
}
public void setUserPass(String userPass) {
UserPass = userPass;
}
public void handleMessage(SoapMessage soap) throws Fault
{
List<Header> headers = soap.getHeaders();
Document doc = DOMUtils.createDocument();
Element auth = doc.createElementNS("http://tempuri.org/","SecurityHeader");
Element UserName = doc.createElement("UserName");
Element UserPass = doc.createElement("UserPass");
UserName.setTextContent(this.UserName);
UserPass.setTextContent(this.UserPass);
auth.appendChild(UserName);
auth.appendChild(UserPass);
headers.add(0, new Header(new QName("SecurityHeader"),auth));
}
}
拦截器的配置按照wsdl调用服务验证头信息来配置,这些信息从wsdl中可以找到。
到这里就大功告成了。接下来就是测试是否调用成功了。