1

次のコード スニペットを使用して、動的な Web サービス呼び出しを実行しています。

    JAXBContext jc = getJAXBContext(requestClass, responseClass, jaxbContextExtraClasses);
    Dispatch<Object> dispatch = service.createDispatch(portQName, jc, Service.Mode.PAYLOAD);

    Object requestValue = getRequestValue(requestClass, pOrderedParameters);
    JAXBElement<?> request =
            new JAXBElement(new QName(serviceQNameStr, pOperationName), requestValue.getClass(), null, requestValue);
    Object tmpResponse = dispatch.invoke(request);

サービスにユーザー定義の例外を追加する場合を除いて、呼び出しは完全に機能します (基本的な UserException は java.lang.Exception を拡張します)。

最初に私は得る:

javax.xml.bind.UnmarshalException: 予期しない要素 (uri:" http://schemas.xmlsoap.org/soap/envelope/ "、local:"Fault")。期待される要素は <{ http://my.namespace/ }myMethod>,<{ http://my.namespace/ }myResponse> です

次に、UserException_Exception JAX-WS で生成された型を JAXB コンテキストに追加し、次を取得します。

原因: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 カウントの IllegalAnnotationExceptions java.lang.StackTraceElement には、引数のないデフォルト コンストラクタがありません。この問題は、次の場所に関連しています: java.lang.StackTraceElement の public java.lang.StackTraceElement[] java.lang.Throwable.getStackTrace() の java.lang.Throwable の java.lang.Exception

私が見つけた唯一の解決策は次のとおりです。

  • Soap メッセージを直接ディスパッチし、Soap 障害を直接処理します (これは、Jboss JAX-WS 実装がサービス インターフェイスを使用して標準の JAX-WS 呼び出しを実行する方法です)。これは私にとって利用可能な解決策ではありません。高レベルの実装を使用したいです (Soap メッセージに近づくほど、コードの動的性が低下します)
  • @XmlTransient として java.lang.Exception に注釈を付けるために、JAXBRIContext.ANNOTATION_READER の使用は実装固有であり、私にとっては利用可能な解決策ではありません

ユーザー定義の例外を含むサービスは、JAX-WS で生成された標準クライアント スタブを使用し、Soap UI などのツールを使用して適切に実行されます。JAXB コンテキストにユーザー定義の例外アーティファクトがない場合、および JAXB コンテキストに JAXB と互換性のないアーティファクトを追加する場合の呼び出し中に、メッセージの逆シリアル化で問題が発生します。

Jboss 4.2.3.GA内でJboss WS Webサービススタックを使用しています

この問題に対するエレガントな解決策は歓迎されます!

4

1 に答える 1

0

例外を追加したときにそれに応じてWSDLを変更しましたか、それともSEIからWSDLを生成しましたか?そこに定義されている例外のFault要素はありますか?

于 2009-12-30T03:09:46.493 に答える