Axis 的开发看起来比较繁琐,但搞多了你就会很快
总结出一定的套路。复杂的应用也是有简单组合起来的。
在进行开发之前,你需要先确定:这个Web Service需要向外部
提供那些接口。接口的参数和返回值。最好就写出个java接口文件。
然后先做个空的类来实现这个接口。
然后再针对这个类编写wsdd文件。然后照标准的方法deploy 这样就搭起了一个
框架。最后再在类中实现具体的功能。并编写客户端测试。
其中我认为比较核心的事情,就是对象序列化。
凡是不属于基本类型的对象都需要序列化。因为axis需要知道怎样
把对象解析称xml文本在后传输。
wsdd里最重要的内容也就是指明那些对象需要序列化。
下面是一个wsdd的例子:<deployment
    xmlns="http://xml.apache.org/axis/wsdd/"
    xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"
    xmlns:ns="urn:Test">  <service name="MyService" provider="java:RPC" style="rpc" use="encoded">      <parameter name="wsdlTargetNamespace" value="Test"/>
      <parameter name="className" value="com.xxx.xxx.MyServiceSOAPBindingImpl"/>
      <parameter name="allowedMethods" value="*"/>      <typeMapping
        qname="ns:MyJavaBean"
        type="java:com.xxx.xxx.MyJavaBean"
        serializer="org.apache.axis.encoding.ser.BeanSerializerFactory"
        deserializer="org.apache.axis.encoding.ser.BeanDeserializerFactory"
        encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
      />
    </service>
</deployment>
这里MyJavaBean是自定义的JavaBean,需要注册。
其他都是通用的套路。
如果你返回的是一个List 而这个List里包含多个JavaBean
那么List本身不需要注册 axis会认得。
至于发布的方法和客户端的代码示例,你可以参考axis上的例子。

解决方案 »

  1.   

    非常非常感谢你的回复!
    我就是按照你的这个思路去做的。整个开发框架的搭建我是理解的,我的主要问题还是出现在
    在wsdd描述文件里配置复杂数据类型序列化上,上面这个javabean的例子我也是理解的,但是如果是LIst(包含多个bean)的话,虽然list本身axis是认识的,可是如果不声明它内部的
    对象是那中bean类型的话,客户端如何反序列化呢??
      

  2.   

    我又看了一遍axis的例子,我觉得axis好狡猾阿,它是用bean数组来实现的,内部类型当然一目了然了,可是list(hashmap)集合怎么声明内部类型呢?
    我觉得wsdl文件里应该有类似下面的标记,客户端才明白吧(我乱写的):<complexType name="list">
     <sequence>
     <element name="item" >
     <complexType> 
    <sequence>
     <element name="key" type="anyType" /> 
    <element name="value" type="com.....bean" /> 
    </sequence>
     </complexType> 
    </element>
     </sequence> </complexType>
      

  3.   

    我建议你直接使用对象数组。而不是使用java.util.*里的东西;
    数组才是通用的,这样你的Web Service才能与其他语言的SOAP SDK交流,
    否则与外界交流会出现很多麻烦。
    客户端除了注册那个对象外也需要注册一个对象数组qname = new QName(uri, "ArrayOf_tns1_MyJavaBean");
    map.register(
        MyJavaBean[].class,
        qname,
        new ArraySerializerFactory(),
        new ArrayDeserializerFactory());这样返回的结果就可以直接强制转换了。