根据好多教程,用jbuilder2006制作的webservice+tomcat,终于发布了.
并且根据自动生成的generated做出了相应的接口.
在做客户端应用的时候,简单对象是可以读取的,
但是当webservice返回一个list时候,客户端就傻了,老错.
这个list在生成的generated的bean中返回的是一个object[]
后来查了资料才明白是复杂对象的传输问题,需要在服务器端修改配置.于是我就拿server-config.wsdd开了刀.
手动将我的BEAN作了设置:
    <service name="ZowellBean" type="" provider="java:RPC" style="rpc" use="encoded">
        <parameter name="scope" value="Request"/>
        <parameter name="className" value="zowell.service.ZowellBean"/>
        <parameter name="allowedMethods" value="*"/>
        <namespace>http://service.zowell</namespace>
                   <typeMapping
            xmlns:ns1="http://service.zowell"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"
            qname="ns1:ArrayOfString"
            languageSpecificType="java:java.lang.String[]"
            serializer="org.apache.axis.encoding.ser.ArraySerializerFactory"
            deserializer="org.apache.axis.encoding.ser.ArrayDeserializerFactory"
            name="ArrayOfString" regenerateElement="true"/>
    </service>
但是当客户端调用的时候依然是报错。
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
 faultSubcode: 
 faultString: org.xml.sax.SAXParseException: Premature end of file.
 faultActor: 
 faultNode: 
 faultDetail: 
{http://xml.apache.org/axis/}stackTrace:org.xml.sax.SAXParseException: Premature end of file.我就迷茫了,请问我还需要在什么地方进行设置,或者怎么修改才能让服务器解析

解决方案 »

  1.   

    http://service.zowel
    少个包或路径不对
      

  2.   

    在ZowellBean中的另外一个方法返回值是String型的方法getZowellName()是可以得到返回值得。
    但是其中返回值是List(object[])却得不到,并报上面所写错误
      

  3.   

    终于成功了。
    把过程说一下。
    首先 object[]在java中不能算是复杂对象,他是可以被序列化的。并且接受和反序列化也没有问题。
    typeMapping是针对于一些复杂型类型的映射.
    有意思的是对于这样的返回
    public Object[] getNewObject(){return new Object[];}
    按理说,jbuilder应该给Object[]进行一个映射,来确保客户端可以用这中类型进行操作.
    但是,当生成webservice的时候jb并没有给Object[]加映射,我也正是因为这个苦恼不已.
    加之client端报上述错误,自然将两者联系在一起.认为错误是因为typemapping的问题.
    于是我对照了一些成功的案例,一次次的重做.一次偶然的机会,我发现我只在拼命的调试wenservice端(因为下意识就是这里的错误),而没有在意楼上说的话.当我谨慎的将接口重新做完,发布,应用的时候发现,nnd,好了!
    于是明白了,即使是返回object[]型,在接口中我已经给他转换了,并且这个东西不需要mapping.
    我有测试了一下
    public Object[] getNewObject(Object[] b){return b;}
    发现,jb竟然在server-config.wsdd中莫名其妙的添加上了,于是开朗了.
    返回结果的mapping规则:
    axis在返回结果的对象,如果此对象非java简单对象(自定义bean)那么jb会给他作一个mapping.
    如果是返回一个Object 或array那么将不给mapping
    作为参数传送到webservice的mapping规则:
    非String int对象,jb都会为其做一个mapping.以适应参数在网路上的序列化.
    ------------------------------------
    而我的错误,仅仅是接口没有做好而已