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

时间:2013-04-18 18:11:11

标签: java web-services wsdl axis sax

我尝试通过以下方式从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客户端但没有成功。还有什么可能是问题?

3 个答案:

答案 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-在回复中,我得到了一个在我班上没有的额外字段。我在这里做的是将字段添加到我的类中,并添加到静态块中,就像任何其他字段一样。

希望它有所帮助。