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

これを行うと、次の例外 (スタックトレース) が発生します。

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 1.x で解決されていないこのバグ ( AXIS-2758 ) に関連している可能性があります。

この問題は、クライアント スタブがサーバー側 (WSDL ファイル) で最新でない場合に発生する可能性があります。再生成する必要がある場合があります。axistools:wsdl2javaと同様です。

少なくとも Java 6 を使用している場合、現在の最善の方法は、クライアント側で JAX-WS を使用することです ( JAX-WS Maven Plugin )。しかし、RPC/Encoded を使用する古い SOAP サービスでは動作しませんでした... Document/Literal スタイルを優先してください。

于 2014-05-19T16:31:54.323 に答える
2

この問題の回避策:

生成されたクラスを開きます (この質問では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"));
于 2014-05-26T09:28:08.210 に答える
1

私は同じ問題を抱えており、SoapUI を使用して Web サービスを試した後、応答で取得していたフィールドと WSDL によって生成されたフィールドの間に 2 つの矛盾があることを発見しました。

1- 何らかの理由で、WSDL から構造を生成したときに、次のようにフィールド名の後にスペースが挿入されました。

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

そのスペースを削除したところ、問題が修正されました。

2-応答で、クラスに存在しない追加のフィールドを取得していました。ここで行ったことは、クラスにフィールドを追加し、他のフィールドと同様に静的ブロックにも追加することでした。

それが役に立てば幸い。

于 2017-04-26T20:10:20.967 に答える