0

Tomcat にデプロイされた RESTEasy を使用して REST-ful Web サービスを開発しています。リクエスト中に例外が発生したときに、例外のメッセージを受け取り、それに基づいて XML を生成するエラー ページを構成しました。

これは、アプリケーションで生成された例外に対して正常に機能します。ただし、クライアントが正しくアンマーシャリングできない無効な XML を送信すると、javax.xml.bind.UnmarshalExceptionがスローされ、Tomcat のデフォルトのエラー ページが私の代わりに使用されます。

web.xml でエラー ページをエラー コード 500 に設定しました。

RESTEasy を使用する場合、エラー ページを使用してエラーを処理する正しい方法ですか、それとも別の方法がありますか?

4

1 に答える 1

1

最良の方法は、ExceptionMapper を使用することです。ExceptionMapper を実装するクラス UnmarshalExceptionMapper を作成します。これに「@Provider」で注釈を付け、Application コンストラクターで「classes.add(UnmarshalExceptionMapper.class)」または「singletons.add(new UnmarshalExceptionMapper())」を実行します。

例外マッパーは次のようになります。

 @provider
 public class UnmarshalExceptionMapper 
            implements ExceptionMapper<UnmarshalException> {
    public Response toResponse(UnmarshalException exception) {
        ResponseBuilder rb =
            Response.status(
                  Response.Status.BAD_REQUEST)  // Most appropriate HTTP status code
            .entity(your xml goes here)
            .type("application/xml");  
        return rb.build();
   }
 }

現在、例外マッパーに対してコンテンツ ネゴシエーションが行われていないため、タイプを「application/xml」に設定する必要があることに注意してください。独自のコンテンツ ネゴシエーションを行うには、リクエストから HttpHeaders を取得し、「accept」ヘッダーを見つけて、それに応じてタイプを設定します。

于 2010-03-31T23:12:18.757 に答える