次のコード スニペットを使用して、動的な 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サービススタックを使用しています
この問題に対するエレガントな解決策は歓迎されます!