springboot整合cxf调用websrevice,带上用户名和密码验证。
来源:互联网 发布:大数据魔镜 编辑:程序博客网 时间:2024/06/05 15:32
公司项目要与外部的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中可以找到。
到这里就大功告成了。接下来就是测试是否调用成功了。
阅读全文