我尝试通过以下方式从Web服务获取结果。
List result = new Vector();
LibrarySearchRequest request = new LibrarySearchRequest(queryString);
LibrarySearchServicePortTypeProxy proxy =
new LibrarySearchServicePortTypeProxy();
LibrarySearchServicePortType port = proxy.getLibrarySearchServicePortType();
LibrarySearchResponse response = port.process(request);
librarysearch.soft.Book[] books = response.getBooks();
当我这样做时,我得到以下异常(stacktrace):
org.xml.sax.SAXException: Invalid element in librarysearch.soft.Book - book
at org.apache.axis.encoding.ser.BeanDeserializer.onStartChild(BeanDeserializer.java:258)
at org.apache.axis.encoding.DeserializationContext.startElement(DeserializationContext.java:1035)
at org.apache.axis.message.SAX2EventRecorder.replay(SAX2EventRecorder.java:165)
at org.apache.axis.message.MessageElement.publishToHandler(MessageElement.java:1141)
at org.apache.axis.message.RPCElement.deserialize(RPCElement.java:236)
at org.apache.axis.message.RPCElement.getParams(RPCElement.java:384)
at org.apache.axis.client.Call.invoke(Call.java:2467)
at org.apache.axis.client.Call.invoke(Call.java:2366)
at org.apache.axis.client.Call.invoke(Call.java:1812)
at librarysearch.soft.LibrarySearchServiceSOAP11BindingStub.process(LibrarySearchServiceSOAP11BindingStub.java:180)
at softarch.portal.db.ws.WS_RegularDatabase.findRecords(WS_RegularDatabase.java:44)
at softarch.portal.db.test.TestWSRegularDatabase.main(TestWSRegularDatabase.java:39)
The regular database has caught an unexpected exception: ; nested exception is:
org.xml.sax.SAXException: Invalid element in librarysearch.soft.Book - book
我读到的问题可能是由webservice返回的结果与wsdl生成的类不匹配引起的。我重新生成了我的webservice客户端但没有成功。还有什么可能是问题?
答案 0 :(得分:2)
这可能与此错误(AXIS-2758)有关,与Axis 1.x无关。
如果客户端存根与服务器端(WSDL文件)不是最新的,则会出现此问题。你可能不得不重新生成它。 与axistools:wsdl2java一样。
现在最好的,如果你至少使用Java 6,可能是在客户端使用JAX-WS(JAX-WS Maven Plugin)。但它无法使用RPC / Encoded的旧SOAP服务...更喜欢Document / Literal样式。
答案 1 :(得分:0)
解决方法解决此问题:
打开生成的类(对于这个问题,它是librarysearch.soft.Book
)。请参阅静态代码块,它定义了字段的属性(名称,类型等)。
你会像下面这样:
elemField.setXmlName(new javax.xml.namespace.QName("", "book"));
通过向其添加namespaceURI来更改它(使用namespameURI
调用时使用的setXmlType
):
elemField.setXmlName(new javax.xml.namespace.QName("http://your.namespaceuri.here", "book"));
答案 2 :(得分:0)
我遇到了同样的问题,在使用SoapUI尝试Web服务之后,我发现我在响应中获得的字段与WSDL生成的字段之间存在两个不一致:
1-出于某种原因,当我从WSDL生成我的结构时,它在字段名后面加了一个空格,如下所示:
elemField.setXmlName(new javax.xml.namespace.QName("http://namespaceuri.here", "book "));
我刚删除了那个空格,它修复了问题。
2-在回复中,我得到了一个在我班上没有的额外字段。我在这里做的是将字段添加到我的类中,并添加到静态块中,就像任何其他字段一样。
希望它有所帮助。