8

現在、Spring WS を使用してエラー コードとメッセージの問題に直面しています。

便宜上、JAXB2 バインディングと @Endpoint および @PayloadRoot アノテーションを備えた Spring WS 2.0 を使用しています。

エンドポイントは次のようになります。

@Endpoint
public class MyEndpoint() {
    private static final String MY_NAMESPACE=...;

    @PayloadRoot(namespace=MY_NAMESPACE, localPart="myPart")
    public MyPartResponse handleMyPart(MyPart myPart) {
        ....
    }
}

XSD で定義された POX メッセージの薄いラッパーとしてのみ、soap を使用します。これは、エラーの代わりにリターン コードとメッセージを使用することも意味します。

各レスポンスは

<xs:complexType name="ResultBase">
    <xs:sequence>
        <xs:element name="errorCode" type="tns:ErrorCode" />
        <xs:element name="errorMessage" type="xs:string" />
    </xs:sequence>
</xs:complexType>

次のように、成功した場合にいくつかの詳細を追加します。

<xs:element name="MySpecificResponse">
    <xs:complexType>
        <xs:complexContent>
            <xs:extension base="tns:ResultBase">
                <xs:sequence>
                    <xs:element name="mySpecificElement" type="tns:MySpecificType" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:element>

handleMyPartメソッド内でスローされるすべての例外は、きれいにマップできます。

ただし、次の 2 種類のエラーは捕捉されず、明確なエラー メッセージではなくエラーが生成されます。

  • XSD 検証エラー
  • 不正な XML エラー

結局のところ、これらは Spring WS を使用するすべての POX Web サービスに関連する問題です。これらの例外をどのように傍受し、応答オブジェクトにマップする必要がありますか?

ただし、すべての応答オブジェクトは共通のものから継承するため、わずかに異なりますが、いくつかの独自のオプション コンテンツを追加します。

4

1 に答える 1

5

私にとってうまくいったアプローチの1つはこれです:

XSD 検証エラーの場合、AbstractValidatingInterceptor を拡張して XSD 検証エラーのカスタム処理を提供し、それを Spring コンテキストで validatingInterceptor Bean として設定します。

不正な XML の場合、MessageDispatcherServlet を拡張します。doService をオーバーライドして DomPoxMessageException をキャッチし、その例外をキャッチしたときに独自のカスタム ハンドリングを追加します。カスタマイズした MessageDispatcherServlet を web.xml で spring-ws サーブレットとして設定します。

私はここに私のブログ投稿でこれを詳細と吐き気を込めて書いています:

http://www.dev-garden.org/2011/09/03/handling-pox-errors-in-spring-ws-part-1/

-ラリー

于 2011-10-17T02:15:09.567 に答える