利用wsdl地址生成java客户端调用类并实现动态配置的方法

前言:

        有时,我们经常要和一些外部系统对接,如果是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>


猜你喜欢

转载自blog.csdn.net/u013262534/article/details/80934578