1、利用JDK处带的wsimport.exe工具,根据wsdl文件生成相应的类文件
格式:wsimport -s "src目录" -p "生成类所在包名" -keep "wsdl发布地址"
示例:wsimport -s D:\\Work -p com.client -keep http://127.0.0.1:8080/sys/webservice/sysSynchroGetOrgWebService?wsdl
2、引入maven包
org.apache.cxf
cxf-rt-frontend-jaxws
3.3.0
org.apache.cxf
cxf-rt-transports-http
3.3.0
3、消息头验证信息
import org.apache.cxf.binding.soap.SoapHeader;
import org.apache.cxf.binding.soap.SoapMessage;
import org.apache.cxf.binding.soap.interceptor.AbstractSoapInterceptor;
import org.apache.cxf.headers.Header;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.phase.Phase;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
import java.util.List;
public class AddSoapHeader extends AbstractSoapInterceptor {
private String url;
private String username;
private String password;
public AddSoapHeader() {
super(Phase.PREPARE_SEND);
}
public AddSoapHeader(String url,String username, String password) {
// 定义在哪个阶段进行拦截
super(Phase.PREPARE_SEND);
this.url = url;
this.username = username;
this.password = password;
}
@Override
public void handleMessage(SoapMessage message) throws Fault {
List headers = message.getHeaders();
Document doc = DOMUtils.createDocument();
Element auth = doc.createElementNS(this.url,"tns:RequestSOAPHeader");
Element username = doc.createElement("tns:user");
Element password = doc.createElement("tns:password");
username.setTextContent(this.username);
password.setTextContent(this.password);
auth.appendChild(username);
auth.appendChild(password);
headers.add(new SoapHeader(new QName("RequestSOAPHeader"), auth));
}
}
4、添加连接信息
import org.apache.cxf.interceptor.LoggingInInterceptor;
import org.apache.cxf.interceptor.LoggingOutInterceptor;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
public abstract class WebServiceClient {
@Autowired
private AppConfig appConfig;
/**
* 连接
* @param serviceClass
* @return
*/
public Object callService(Class serviceClass){
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
// 记录入站消息
factory.getInInterceptors().add(new LoggingInInterceptor());
// 记录出站消息
factory.getOutInterceptors().add(new LoggingOutInterceptor());
// 添加消息头验证信息。如果服务端要求验证用户密码,请加入此段代码
factory.getOutInterceptors().add(new AddSoapHeader(appConfig.oaUrl,appConfig.oaUser,appConfig.oaPassword));
factory.setServiceClass(serviceClass);
factory.setAddress(appConfig.oaAddress);
// 创建服务代理并返回
return factory.create();
}
}
5、调用webService
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
/**
* 输入参数
**/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "sysSynchroGetOrgInfoTokenContext", propOrder = {"pageNo", "token", "beginTimeStamp", "count", "returnOrgType"})
public class SysSynchroGetOrgInfoTokenContext {
protected int pageNo;
protected String token;
private String beginTimeStamp;
private int count;
private String returnOrgType;
public String getReturnOrgType() {
return returnOrgType;
}
public void setReturnOrgType(String returnOrgType) {
this.returnOrgType = returnOrgType;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getBeginTimeStamp() {
return beginTimeStamp;
}
public void setBeginTimeStamp(String beginTimeStamp) {
this.beginTimeStamp = beginTimeStamp;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int value) {
this.pageNo = value;
}
public String getToken() {
return token;
}
public void setToken(String value) {
this.token = value;
}
}
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
/**
* 输出参数对象
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "sysSynchroOrgTokenResult", propOrder = { "count", "message", "returnState", "token" })
public class SysSynchroOrgTokenResult {
protected int count;
protected String message;
protected int returnState;
protected String token;
public int getCount() {
return count;
}
public void setCount(int value) {
this.count = value;
}
public String getMessage() {
return message;
}
public void setMessage(String value) {
this.message = value;
}
public int getReturnState() {
return returnState;
}
public void setReturnState(int value) {
this.returnState = value;
}
public String getToken() {
return token;
}
public void setToken(String value) {
this.token = value;
}
}
import javax.jws.WebParam;
import javax.jws.WebService;
/**
* 接口WebService
* name:接口service名称
* targetNamespace: 接口命名空间
*/
@WebService(name = "ISysSynchroGetOrgWebService", targetNamespace = "http://out.webservice.organization.sys.kmss.landray.com/")
public interface ISysSynchroGetOrgWebService {
/**
* @param arg0
* @return
* @throws Exception_Exception
*/
SysSynchroOrgTokenResult getUpdatedElementsByToken(@WebParam(name = "arg0", targetNamespace = "") SysSynchroGetOrgInfoTokenContext arg0) throws Exception_Exception;
}
public class OASysDeptServerImpl extends WebServiceClient {
@Autowired
private BaseClient baseClient;
public void sysDept() {
try {
ISysSynchroGetOrgWebService data = (ISysSynchroGetOrgWebService)this.callService(ISysSynchroGetOrgWebService.class);
this.queryDept(data,1,null);
} catch (Exception e) {
e.printStackTrace();
}
}
@SneakyThrows
private void queryDept(ISysSynchroGetOrgWebService data, Integer pageNo, String token){
//输入参数设置
SysSynchroGetOrgInfoTokenContext tokenRequest = new SysSynchroGetOrgInfoTokenContext();
tokenRequest.setPageNo(pageNo);
tokenRequest.setCount(1000);
if(!StrUtil.isEmptyIfStr(token)){
tokenRequest.setToken(token);
}
SysSynchroOrgTokenResult tokenResult = data.getUpdatedElementsByToken(tokenRequest);
System.out.println(String.format("接口返回数据:%s", Json.encode(tokenResult)));
}