根据好多教程,用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.我就迷茫了,请问我还需要在什么地方进行设置,或者怎么修改才能让服务器解析
并且根据自动生成的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.我就迷茫了,请问我还需要在什么地方进行设置,或者怎么修改才能让服务器解析
少个包或路径不对
但是其中返回值是List(object[])却得不到,并报上面所写错误
把过程说一下。
首先 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.以适应参数在网路上的序列化.
------------------------------------
而我的错误,仅仅是接口没有做好而已