2

AXIS2 1.4 メソッドを使用する AXIS 1.4 クライアントを実装する必要があります。AXIS 1.4 クライアントは、スタブを作成することによって作成されます。クライアントはリクエストを送信し、何らかの添付ファイル (MTOM) を含むサービスからレスポンスを返します。AXIS 1.4 ポート タイプ オブジェクトでメソッド (操作) を呼び出すと、次のエラーが発生しました。

org.xml.sax.SAXException: SimpleDeserializer encountered a child element, which is NOT expected, in something it was trying to deserialize.

MTOM が AXIS を台無しにしたと思います。ここで質問があります。AXIS2 1.4 (MTOM) Web サービスから返された添付ファイルをどのように取得したのでしょうか? ティア。

フランチェスコ

PS: これがコードです。WSDL によって生成されるスタブがあります。問題は、ポートのスタブ メソッドを呼び出すと例外が発生することです。戻ってきたメッセージには添付ファイルがあります。

String codistat = "CODISTAT";    
OrdinanzeViabilitaLocator ovlocretreive = new OrdinanzeViabilitaLocator();
ovlocretreive.setOrdinanzeViabilitaHttpSoap11EndpointEndpointAddress(".. the service url + action..");
try {
  OrdinanzeViabilitaPortType ovretreive = ovlocretreive.getOrdinanzeViabilitaHttpSoap11Endpoint();
  ((Stub) ovretreive)._setProperty(javax.xml.rpc.Call.USERNAME_PROPERTY, "username");
  ((Stub) ovretreive)._setProperty(javax.xml.rpc.Call.PASSWORD_PROPERTY, "password");            
  //problems began here
  MessageReqOrdinanze mrq = new MessageReqOrdinanze();
  mrq.setCodistat(codistat);
  Calendar date_from = Calendar.getInstance();
  date_from.setTimeInMillis(0);
  Calendar date_to = Calendar.getInstance();
  date_from.setTimeInMillis(0);
  mrq.setDate_from(date_from);
  mrq.setDate_to(date_to);
  // the next line generate the exception
  MessageOrdinanze mretreive = ovretreive.getOrdinanze(mrq);
  } catch (AxisFault e) {
        e.printStackTrace();
  } catch (RemoteException e) {
        e.printStackTrace();
  } catch (FileNotFoundException e) {
        e.printStackTrace();
  } catch (IOException e) {
        e.printStackTrace();
  } catch (ServiceException e) {
        e.printStackTrace();
  }

返されるメッセージには

<xop:include href="cid... >...< ../xop/include"/>

内部のタグ、それはMTOMです(私が推測する例外が発生します)。お役に立てれば。

4

2 に答える 2

4

MTOM をクライアント側で機能させるには、次の 2 つのことを行う必要があります。

  1. スタブで、型がではなく にxs:base64Binaryマップされていることを確認します。java.activation.DataHandlerbyte[]
  2. および(MTOM をサポートする)を使用するxs:base64Binaryおよびの (ランタイム) タイプ マッピングを設定します。java.activation.DataHandlerJAFDataHandlerSerializerJAFDataHandlerDeserializer

2番目の部分はかなり簡単です。client-config.wsdd次の型マッピングを使用してファイルを設定するだけです。

<typeMapping languageSpecificType="java:javax.activation.DataHandler" qname="xs:base64Binary"
             deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
             serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory" 
             encodingStyle=""/>

Axis 1.4 のツール (wsdl2java) は、特定の XML 型に関連付けられた Java 型の変更をサポートしていないため、最初の部分はより複雑です。この制限を回避するには、いくつかの方法があります。

  • 生成されたスタブを手動で編集し、 に変更byte[]javax.activation.DataHandlerます。プロジェクトで生成されたコードをどのように管理するかによって、それが受け入れられるソリューションである場合とそうでない場合があります。
  • javax.activation.DataHandler{http://www.w3.org/2001/XMLSchema}base64Binary 型が {java}javax に置き換えられた変更された WSDL を wsdl2java に与えることで、wsdl2java をだまして使用させることがおそらく可能です (私はそれをテストしませんでした) 。 .activation.DataHandler。
  • このタイプの構成をサポートするように、現在の Axis トランクのツールを修正しました。ただし、これは wsdl2java Maven プラグインでのみ実装されることに注意してください (ただし、Ant タスクまたはコマンド ライン ツールでは実装されません)。そのプラグインの 1.4.1-SNAPSHOT バージョンを使用できます。生成されたコードは Axis 1.4 でも機能します。ドキュメントはこちらにあります
于 2012-03-19T21:57:54.020 に答える
0

上記のソリューションは素晴らしいです。ただし、上記のコード スニペットを機能させるのに苦労している可能性がある人は、 を使用してください。指定されたスニペットxmlns:xs="http://www.w3.org/2001/XMLSchema"のみが機能します。typeMapping

<typeMapping qname="xs:base64Binary" languageSpecificType="java:javax.activation.DataHandler"
deserializer="org.apache.axis.encoding.ser.JAFDataHandlerDeserializerFactory"
    serializer="org.apache.axis.encoding.ser.JAFDataHandlerSerializerFactory"
    xmlns:xs="http://www.w3.org/2001/XMLSchema" encodingStyle="" />
于 2016-03-02T15:10:35.863 に答える