首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

wsdl之自动生成java代码及可配备化

2012-11-03 
wsdl之自动生成java代码及可配置化?? 当java需要调用.net的webservice服务时,我们希望通过显式的代码调用,

wsdl之自动生成java代码及可配置化

?? 当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)的形式来完成,同样没问题,呵呵。

热点排行