5

我尝试通过以下方式从 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

我读到问题可能是由于从 web 服务返回的结果与从 wsdl 生成的类不匹配引起的。我重新生成了我的 web 服务客户端,但没有成功。还有什么问题?

4

3 回答 3

6

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

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

如果您至少使用 Java 6,现在最好的可能是在客户端使用 JAX-WS(JAX-WS Maven 插件)。但它不能与使用 RPC/Encoded 的旧 SOAP 服务一起使用......更喜欢 Document/Literal 样式。

于 2014-05-19T16:31:54.323 回答
2

此问题的解决方法

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

你会像下面这样:

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

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

elemField.setXmlName(new javax.xml.namespace.QName("http://your.namespaceuri.here", "book"));
于 2014-05-26T09:28:08.210 回答
1

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

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

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

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

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

希望能帮助到你。

于 2017-04-26T20:10:20.967 回答