如何解决SAXException:in中的元素无效

我尝试以下列方式从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(); 

当我这样做时,我得到以下exception(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客户端但没有成功。 还有什么可能是问题?

这可能与此错误( AXIS-2758 )有关,与Axis 1.x无关。

如果客户端存根与服务器端(WSDL文件)不是最新的,则会出现此问题。 你可能不得不重新生成它。 和axistools一样:wsdl2java 。

如今,如果你至少使用Java 6,那么最好的就是在客户端使用JAX-WS( JAX-WS Maven插件 )。 但它无法使用RPC / Encoded的旧SOAP服务…更喜欢Document / Literal样式。

解决此问题的方法:

打开生成的类(对于这个问题,它是librarysearch.soft.Book )。 请参阅定义字段属性(名称,类型等)的静态代码块

你会像下面这样:

 elemField.setXmlName(new javax.xml.namespace.QName("", "book")); 

通过向其添加namespaceURI来更改它(使用在setXmlType调用时使用的相同namespameURI ):

 elemField.setXmlName(new javax.xml.namespace.QName("http://your.namespaceuri.here", "book")); 

我遇到了同样的问题,在使用SoapUI尝试Web服务之后,我发现在响应中获得的字段与WSDL生成的字段之间存在两个不一致:

1-由于某种原因,当我从WSDL生成我的结构时,它在字段名称后面放了一个空格,如下所示:

 elemField.setXmlName(new javax.xml.namespace.QName("http://namespaceuri.here", "book ")); 

我刚删除了那个空间,它修复了问题。

2-在回复中,我得到了一个在我class上没有的额外字段。 我在这里做的是将字段添加到我的类中,并添加到静态块中,就像任何其他字段一样。

希望能帮助到你。