前段时间对接第三方系统时,需要根据对方的wsdl文件生成java客户端,然后进行调用。由于之前没有接触过,各种百度谷歌,现在记录如下:

  1. 可用的方法;
  2. 使用axis2生成java客户端;
  3. 实现为Spring Boot项目;

一、可用的方法

    1、使用apache-cxf。尝试之后没有成功,好像是版本支持的问题,然后放弃了。

    2、使用eclipse。过程比较简单:

        (1)new --> Dynamic Web Project

        (2)在刚刚新建的项目上右键,然后new --> Web Service Client,填写wsdl的地址,选择Develop client,然后finish。

eclipse设置

    但是创建完成之后,代码有错误,所以也放弃了:

    (3)最后使用axis2生成了java客户端。

二、使用axis2生成java客户端

    1、下载axis2:http://axis.apache.org/axis2/java/core/download.html#,下载axis2-1.7.9-bin.zip,解压。

    2、命令行进入解压文件的bin目录下,执行命令(windows系统使用bat命令):

        wsdl2java.sh -uri wsdl文件的路径 -o 生成文件的保存路径 -p 包名

        例如:wsdl2java.sh -uri /Users/zzc/MXSE_beta.wsdl -o /Users/zzc/mycode/ -p com.zzc.myplugin.axis2test

    3、如果出现异常:You must set the JAVA_HOME variable before running Axis2 Script.,手动设置一下JAVA_HOME:

        export JAVA_HOME="/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk/Contents/Home"

    4、运行成功后会得到两个文件:XXXCallbackHandler.java、XXXStub.java。其中XXXStub.java就是客户端接口的实现类。

三、实现为Spring Boot项目

    1、初始化一个Spring Boot项目,包名就用上面指定的包,比如:com.zzc.myplugin.axis2test,将上面生成的两个文件copy到包下面。

    2、引入axis2的相关依赖:注意maven的版本尽量和上面步骤中下载的axis2的版本保持一直,否则可能会报错,比如构造函数不支持之类的,这个坑也爬了很久...    

    <!-- axis2 -->
    <dependency>  
        <groupId>org.apache.axis2</groupId>  
        <artifactId>axis2-spring</artifactId>  
        <version>1.7.9</version>  
    </dependency>
	<dependency>  
        <groupId>org.apache.axis2</groupId>  
        <artifactId>axis2-transport-http</artifactId>  
        <version>1.7.9</version>  
    </dependency>
    <dependency>  
        <groupId>org.apache.axis2</groupId>  
        <artifactId>axis2-transport-local</artifactId>  
        <version>1.7.9</version>  
    </dependency>  
    <dependency>  
        <groupId>org.apache.axis2</groupId>  
        <artifactId>axis2-kernel</artifactId>  
        <version>1.7.9</version>  
    </dependency>
    <dependency>
	  <groupId>org.apache.axis2</groupId>
	  <artifactId>axis2-adb</artifactId>
	  <version>1.7.9</version>
    </dependency>
    <!-- axis2 -->

    3、修改客户端代码,添加属性

         一般调用第三方系统是要账号、密码之类的权限验证的;而且测试和生产的url地址(也就是targetEndpoint)也是不一样的。所以我们需要在XXXStub.java中添加一些新的字段,同时将测试和生产的url地址添加为spring的配置类。

    (1)在XXXStub.java中添加账号、密码字段:

 

 

    (2)新建XXXProperties.java。

package com.zzc.myplugin.axis2test;

import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix=PftStubProperties.PFT_PREFIX)
public class PftStubProperties {

	public static final String PFT_PREFIX = "myaxis";
	
	private String ac;
	private String pw;
	private String address; // 接口地址
	public String getAc() {
		return ac;
	}
	public void setAc(String ac) {
		this.ac = ac;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	
	
}

 

    该测试项目会作为依赖供其他项目使用,所以记得在对应项目的配置文件里添加配置信息,比如使用application.yml:    

 

    (3)新建配置类XXXConfigration.java,注入客户端,设置账号、密码、请求地址。

package com.zzc.myplugin.axis2test;

import org.apache.axis2.AxisFault;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;




@Configuration
@ComponentScan
@EnableConfigurationProperties({PftStubProperties.class})
public class PftStubConfigration {
	

	@Bean
	@ConditionalOnMissingBean
	public PFTMXStub pftMxStub(PftStubProperties pftStubProperties) throws AxisFault{
		PFTMXStub pftMxStub = new PFTMXStub(pftStubProperties.getAddress());
		pftMxStub.setAc(pftStubProperties.getAc());
		pftMxStub.setPw(pftStubProperties.getPw());
		return pftMxStub;
	}
}

    (4)新建spring.factories文件:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.zzc.myplugin.axis2test.PftStubConfigration

最后的代码结构为:

四、使用客户端调用接口

在需要调用wsdl客户端的项目中,引入上面新建的项目,就可以愉快的调用相应的方法,对接接口了。

@Autowired
private PFTMXStub pftMxStub;

...

pftMxStub.doSomething(param);
...

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐