CXF与Spring集成,方便的调用WebService

用cxf的wsdl2java工具生成客户端代码,但是发现生成的所有自定义的dto类的成员变量,都被映射成JAXBElement<T>的类型了,用起来很麻烦。

后来经过试验,发现将wsdl里的nillable修改为false后,再产生的java代码就是简单的POJO了。

nillable:

一个指示符,指示是否可以将显式的零值分配给该元素。此项应用于元素内容并且不是该元素的属性。默认值为 false。

如果 nillable 为 true,将使该元素的实例可以将 nil 属性设置为 true。nil 属性被定义为实例的 XML 架构命名空间的一部分。

例如,下段定义了单个元素,同时将 nillable 设置为 true。

<xs:element name="myDate" type="xs:date" nillable="true"/>

下段使用该元素并具有显式零值(nil 属性设置为 true)。

<myDate xsi:nil="true"></myDate>

可选。


wsdl2java命令:wsdl2java -client -frontend jaxws21 sss.wsdl



在Spring里能否方便的调用webService呢,CXF里提供了一个方便的工厂类,可以实现方便调用。

       CXF中提供了生成webService客户端stub的工厂类org.apache.cxf.jaxws.JaxWsProxyFactoryBean,此类可以通过URL和stub接口类获取到stub代理(org.apache.cxf.jaxws.JaxWsProxyFactoryBean.create)。可以通过在Spring里将JaxWsProxyFactoryBean配置成bean,然后将stub接口类也配置成bean,但通过工厂方法来生成实例。配置如下:


<bean id="subFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
<property name="serviceClass"
value="com.test.web.service.SubService" />
<property name="address"
value="http://localhost:8080/TestWebService/services/subService" />
</bean>

       (注:serviceClass属性是sub接口类,address是webService的路径)。


<bean id="subService" class="com.test.web.service.SubService"
factory-bean="subFactory" factory-method="create" />


        这样,在其他bean里如果要调用webService,只要将subService这个bean注入到需要使用的bean里,就可以像调用本地bean一样透明的调用webService了。

(注:com.test.web.service.SubService是通过wsdl2java产生的接口类,)
展开阅读全文

没有更多推荐了,返回首页