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

问题描述 投票:2回答:3

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

java web-services wsdl axis sax
3个回答
2
投票

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

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

如今,如果你至少使用Java 6,可能是在客户端使用JAX-WS(JAX-WS Maven Plugin)。但它无法使用RPC / Encoded旧的SOAP服务...更喜欢Document / Literal样式。


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"));

0
投票

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

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

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

我刚删除了那个空间,它解决了问题。

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

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.