Wrapped-styled SOAP service with Axis 1.4

Posted on February 1, 2007

0


我们知道至少有5种Web service styles:

  • RPC/Encoded
  • RPC/Literal
  • Document/Encoded (没有人使用,可以忽略不计)
  • Document/Literal
  • Wrapped Document

这几种方式的优点缺点可以参照这篇文章:Which style of WSDL should I use?

有2点值得我们注意,第一是WS-I建议最好使用Document/Literal方式,这样可以兼容大部分语言,而Wrapped Document大量使用在.NET平台,所以如果需要和.NET交互应该选择4或者5。第二点需要注意的是Axis默认支持的是RPC/Encoded方式,我这里就要介绍下如何用Axis 1.4开发Wrapped Document样式的Web Service。

  1. 写好方法的实现。需要注意的是方法的input可以为多个参数如 public int sum(int x, int y)。Axis会自动把int x和int y放在一个Request TO里面。
  2. 运行Java2WSDL生成所需要的deploy.wsdd文件(部署文件)。
  3. 生成的deploy.wsdd会把所有的wrapper classes也加入进去,我们需要手工删除他们!这点非常重要,否则当你部署后Axis会报错:找不到对应的Java类别.
 <typeMapping xmlns:ns="urn:CDRator"
         qname="ns:>createOrderNewCustomer"
         type="java:com.CDRator.soap.CreateOrderNewCustomer"
         serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
         deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
         encodingStyle=""
 />
 <typeMapping xmlns:ns="urn:CDRator"
         qname="ns:>createOrderNewCustomerResponse"
         type="java:com.CDRator.soap.CreateOrderNewCustomerResponse"
         serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
         deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
         encodingStyle=""
/>

基本上每个方法都会有2个附加的Wrapper定义,这个需要被手工从deploy.wsdd里面删除。我写了一段ANT脚本可以自动去除掉这段代码:

<replaceregexp flags="g" byline="false" 
      file="${deployPrepareDir}\${className}\deploy.wsdd" 
      match="&lt;([^\.]*)Mapping\r(\s*)(.*)\r(\s*)([^\.]*)&quot;ns:&gt;
      ([^\.]*)&quot;(.*)\r(\s*)(.*)\r(\s*)(.*)\r(\s*)(.*)\r(\s*)\/&gt;" 
replace=""/>

最后当我们成生客户端时(WSDL2Java)我们需要注意是参数-W,在生成所需要的客户端类的时候如果-W不选,则Axis会把public int sum(int x, int y)转换为public int sum(Sum obj)。我觉得最好避免这种情况。

当然希望这些在Axis 2里面都得到完美解决。

Posted in: Development