前言:
有时,我们经常要和一些外部系统对接,如果是HTTP接口还好,直接用apache的HttpClient工具类调用即可。而如果对方系统是Webservice,则比较麻烦,本文主要讲解如何用对方的wsdl地址生成java客户端调用类并且动态配置访问地址并在java中使用
1,首先我们先要获取对方的wsdl地址,例如
http://xxxx/xxxx/xxxx.asmx?wsdl
2, 接着,在cxf官网上下载apache-cxf-3.2.5。
2.1,将apache-cxf-3.2.5解压缩后安装在D:\\apache-cxf-3.2.5中,设置CXF_HOME环境变量为D:\\ apache-cxf-3.2.5
如下图所示:
2.2,运行cmd,执行命令wsdl2java,等待大概1秒钟,出现USAGE证明设置成功
2.3,用wsdl地址执行命令:其中-d代表输出路径,后面紧跟着路径,路径后面紧跟着地址,按回车键,生成成功!
3,生成成功后,由于wsdl是写死在生成的java类的注解中的,有时我们会使用多套环境进行测试,验证,而sit和uat环境的wsdl地址是不尽相同的。此时,我们需要动态配置wsdl的地址和命名空间的地址
@Component
public class DebitPushClient implements InitializingBean {
private static URL wsdlUrl;
private static String debitWsdlUrl;
private static String uri;
private static QName SERVICE_NAME;
public static HttpResult pushDebitData(String jsonData) {
FinancialSharing ss = new FinancialSharing(wsdlUrl, SERVICE_NAME);
return (HttpResult) WebServiceClientUtil.invokeWebServiceSoapAction(ss, new QName(uri, "FinancialSharingSoap12"), FinancialSharingSoap.class, "pushDebitData", jsonData);
}
/**
* 初始化wsdl连接地址
*/
private void initWsdlUrl() {
URL url = null;
try {
wsdlUrl = new URL(debitWsdlUrl);
} catch (MalformedURLException e) {
java.util.logging.Logger.getLogger(FinancialSharing.class.getName())
.log(java.util.logging.Level.INFO,
"Can not initialize the default wsdl from {}",
debitWsdlUrl);
}
}
/**
* 从配置文件中读取wsdl地址
* @param debitWsdlUrl 地址
*/
@Value("${my.dfdk.wsdl.url:http://xxx.xxx.asmx?wsdl}")
public void setDebitWsdlUrl(String debitWsdlUrl) {
DebitPushClient.debitWsdlUrl = debitWsdlUrl;
}
/**
* 从配置文件中读取命名空间地址
* @param uri 命名空间地址
*/
@Value("${my.dfdk.wsdl.namespace.uri:http://tempuri.org/}")
public void setUri(String uri) {
DebitPushClient.uri = uri;
}
/**
* 初始化wsdl
* @throws Exception
*/
@Override
public void afterPropertiesSet() throws Exception {
initWsdlUrl();
SERVICE_NAME = new QName(uri, "FinancialSharing");
}
}
4,客户端调用,调用成功后,即可获取正确的响应结果,不需要再将xml转成java对象
这篇文章,只是简单介绍了用wsdl地址生成java客户端调用代码的一种方法,除此之外,还可以用maven plugin
cxf-codegen-plugin
生成
<build>
<finalName>cxf-date</finalName>
<plugins>
<plugin>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-codegen-plugin</artifactId>
<version>${cxf.version}</version>
<executions>
<execution>
<id>generate-sources</id>
<phase>generate-sources</phase>
<configuration>
<sourceRoot>src/main/resources/cxf</sourceRoot>
<wsdlOptions>
<wsdlOption>
<wsdl>http://localhost:8080/cxf-date/services/BookService?wsdl</wsdl>
<frontEnd>jaxws21</frontEnd>
<faultSerialVersionUID>1</faultSerialVersionUID>
</wsdlOption>
</wsdlOptions>
</configuration>
<goals>
<goal>wsdl2java</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>