根据好多教程,用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.我就迷茫了,请问我还需要在什么地方进行设置,或者怎么修改才能让服务器解析
解决方案 »
- 我连接Oracle的时候出现了这个异常是怎么回事呀
- 为什么在t1这个panel里的开始点了没有作用呢?(自己做的简单扫雷,想点击开始然后从新开始!)
- 一个关于persist的问题
- 两台装tomcat不同服务器怎么实现同步影射?
- 初学:请教myeclipse 写的tomcat 怎么样发布到WebLogic服务上? 在线等
- JAVA里如何安全有效地停止(或者说销毁)线程?请指点,万分感谢!
- 本地接口jndi问题,在线等待
- 关于tomcat和oracle的问题?(急)
- Servlet 调用EJB的问题,我被整了两天了!
- 求教关于 【跨 application】 控制同一功能或者属性的问题 .......
- 请问大虾,struts2中标签<s:if>怎么对比String?
- exchange 邮件服务器和j2ee架构应用,如何集成,明天继续加一百分??
少个包或路径不对
但是其中返回值是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.以适应参数在网路上的序列化.
------------------------------------
而我的错误,仅仅是接口没有做好而已