当java需要调用.net的webservice服务时,我们希望通过显式的代码调用,而且也有相当好的maven插件可供使用,如axis的wsdl2code,下面就以此为例,对整个过程搞个step-by-step吧。
1、配置pom.xml,引入axis2-wsdl2code-maven-plugin。还有就是axis的相关包依赖,下面是插件配置:
<build>
......
<plugins>
<plugin>
<groupId>org.apache.axis2</groupId>
<artifactId>axis2-wsdl2code-maven-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>wsdl2code-client</id>
<phase>process-resources</phase>
<goals>
<goal>wsdl2code</goal>
</goals>
</execution>
</executions>
<configuration>
<packageName>com.***.***</packageName>
<wsdlFile>http://127.0.0.1:port/?wsdl</wsdlFile>
<databindingName>adb</databindingName>
<generateServicesXml>false</generateServicesXml>
</configuration>
</plugin>
</plugins>
</build>
packageName:你要生成代码的包路径;
wsdlFile:wsdl地址,就是你可以直接在浏览器里查看结果的那个地址。
databindingName:数据绑定名称,这里用了是adb,还有其他什么xmlBean,jibx等等,切换不同的banding,生成的效果也不同。
下面以adb为例,我们执行install之后,会在插件目录下生成你前面设定的package路径的类存根文件。×××Stub和×××CallbackHandler两个文件。其实我们要用到的也就Stub类。
2、编写访问方法。stub下面有两个对象是需要特别关心的,一个×××Request(请求对象,请求参数在这里编写),一个是ResponseInfo(相应结果,返回结果在这里获取)。 如何实现一个调用呢,下面看看一个最简单的例子吧,假设有一个Person的服务:
// 1、组装参数
PersonRetRequest request = new PersonRetRequest();
request.setName("superMan");
// 2、给需要调用的方法设置参数
PersonStub.Apply action = new PersonStub.Apply();
action.setRequest(request);
// 3、目标请求
PersionStub stub = new PersionStub();
PersonStub.ApplyResponse response = stub.Apply(action);
// 4、获取执行结果
ResponseInfo responseInfo = response.getApplyResult();
3、也许有朋友已经注意到了,这里把targetEndPoint给丢了,用了存根的默认构造,那么目标地址也就代码里写死了,这样明显满足不了动态配置地址的需求。现在再去看看Stub的构造方法,发现它有多个构造方法,其中一个是根据目标地址构造的,也就是wsdl服务地址,这个对我们是相当有用的,因为切换地址是很平常的事情,我们也尽量的能做到可配置话。
本人写了服务地址配置基类,需要进行外部访问的类可以继承此方法,让它具备参数注入的前提,那就是targetEndPoint,下面是源代码:
/**
* <p>远程访问处理抽象类</p>
* 完成对访问地址的封装
*/
public abstract class AbstractRemoteInvoke implements Constant {
protected static final Logger logger = Logger.getLogger(AbstractRemoteInvoke.class);
/** 访问地址信息 */
private String targetEndpoint;
/**
* 获取目标服务对象
* 子类统一调用此方法获取目标服务对象
* @param targetStubClass 目标服务对象class
* @return
*/
@SuppressWarnings("unchecked")
protected Stub getTargetStub(Class targetStubClass) throws AxisFault {
try {
// 如果未设置地址,直接返回默认构造出的对象
if (StringUtil.isBlank(targetEndpoint)
|| targetEndpoint.indexOf(PLACEHOLDER_PREFIX) == 0) {
Constructor constructor = targetStubClass.getConstructor();
return (Stub) constructor.newInstance();
}
Constructor constructor = targetStubClass.getConstructor(String.class);
return (Stub) constructor.newInstance(targetEndpoint);
} catch (Exception e) {
logger.warn("反射构造远程服务对象失败", e);
throw new AxisFault("远程服务不可用!");
}
}
/**
* 设置目标目标地址
* @param targetEndpoint
*/
public void setTargetEndpoint(String targetEndpoint) {
this.targetEndpoint = targetEndpoint;
}
}
接下来要做的就是将 PersionStub stub = new PersionStub(); 替换为 PersionStub stub = (PersionStub)super.getTargetSub(PersionStub.class)。
并且在配置invoke bean的时候增加<property name="targetEndpoint" value="${person.remote.url}" />配置,当然这个地址你还可以通过pom.xml配置实现在编译期的生成。
如果你喜欢用PersionStub stub = new PersionStub(targetEndpoint)的形式来完成,同样没问题,呵呵。
分享到:
相关推荐
axis2根据wsdl生成客户端代码,org.apache.axis.wsdl.WSDL2Java配置"src/???.wsdl"自动生成代码
只需要简单的在wsdl.bat文件中的配置下wsdl文件目录或者wsdl文件url,就可以自动生成客服端代码类。
7.2.11 自动生成SQL语句 113 7.3 JDBC应用实例:登录系统 114 7.4 本章小结 116 第8章 Struts框架的开发及应用 117 8.1 Struts框架概述 117 8.1.1 MVC设计模式 117 8.1.2 Struts框架工作原理 118 8.1.3 Struts框架...
从部署好的服务自动生成WSDL。 WSDL2Java工具可以从WSDL描述文件中产生相应的客户和服务器端SOAP操作框架。 初步提供安全扩展,能够与Servlet2.2安全集成。 通过HTTP Cookie和与传输无关的SOAP头信息提供会话跟踪。 ...
自动生成代码 c. 页面调用Action请求,Action中注入WebService实例bean; Action对应方法直接调用第三方WebService的相关方法; d. 测试; 备注: 1. 步骤b,接口文件必须同包名同类名置于src目录下; 开发一个...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
它包括一系列步骤,例如无监督分类,消除小物体,将波段合并为一个,将栅格转换为矢量以及基于样本数据库和自动生成的输入参数配置的监督分类。 源代码是用C ++编写的。 工作流部分包括一个工作流实例,它是一个jar...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
Web服务自动化:使用从Web服务WSDL文件生成客户端代码,并在同一服务上调用方法 按需截屏并保存在磁盘上 集成的可从测试执行中获取“漂亮”和“有意义”的报告 使用将测试日志存储在文件中(并向控制台报告) 使用...
3.4.3. 配置选项 3.4.4. Resolvers 3.4.4.1. 文件 Resolver 3.4.5. 基本用法 4. Zend_Cache 4.1. 简介 4.2. 缓存原理 4.2.1. Zend_Cache 工厂方法 4.2.2. 标记纪录 4.2.3. 缓存清理 4.3. Zend_Cache前端 ...