8

バックエンドからのエラーを処理しようとしています。handleMessage()エラーが発生したが、コンテンツがXmlMessageのインスタンスである場合に呼び出されます。自分の応答に変更したいのですが、応答コードを設定してメッセージを追加するだけです。

これを行う方法を教えてくれる適切なドキュメントが見つかりません...

これらの例はREST用ですが、これもSOAPで管理したいと思います。

インターセプター

public class ErrorHandlerInterceptor extends AbstractPhaseInterceptor<Message> {

    public ErrorHandlerInterceptor() {
        super(Phase.POST_LOGICAL);
    }

    @Override
    public void handleMessage(Message message) throws Fault {
        Response response = Response
            .status(Response.Status.BAD_REQUEST)
            .entity("HOW TO GET A MESSAGE FROM AN EXCEPTION IN HERE???")
            .build();
        message.getExchange().put(Response.class, response);
    }

}

context.xml

<bean id="errorHandlerInterceptor"
    class="cz.cvut.fit.wst.server.interceptor.ErrorHandlerInterceptor" />

<jaxrs:server address="/rest/">
    <jaxrs:serviceBeans>
        <ref bean="restService" />
    </jaxrs:serviceBeans>
    <jaxrs:outFaultInterceptors>
        <ref bean="errorHandlerInterceptor" />
    </jaxrs:outFaultInterceptors>
</jaxrs:server>
4

2 に答える 2

15

JAX-RSを使用している場合は、例外マッパーをセットアップしてから、そのマッパーを使用して応答を処理してください。

簡単な例:

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class MyExceptionMapper implements
        ExceptionMapper<MyException> {

    @Override
    public Response toResponse(MyException e) {
        return Response.status(Status.NOT_FOUND).build();
    }

}

次に、以下を追加して、プロバイダーをjaxrsサーブに登録する必要があります。

<jaxrs:providers>
    <bean class="com.blah.blah.blah.blah.MyExceptionMapper"/>  
</jaxrs:providers>

コンテキスト内のサーバー構成で。これにより、例外に完全にアクセスでき、例外から必要なものを取得できます。

于 2012-04-10T21:49:34.737 に答える
5

そして、これがあなたのパズルのもう一つのピースです。すでにJAX-RSを使用しているので、 JAX-WSも使用してみませんか?

このスレッドこのブログ投稿では、例外をSOAP障害にマッピングする方法について説明しています。短くて甘い:

JAX-WS 2.0仕様では、注釈が付けられた例外@WebFaultに2つのコンストラクターと1つのメソッドが必要であることが要求されています[障害情報を取得するためのゲッター]:

WrapperException(String message, FaultBean faultInfo)
WrapperException(String message, FaultBean faultInfo, Throwable cause)
FaultBean getFaultInfo()

WrapperExceptionは例外の名前に置き換えられ、FaultBeanは障害Beanを実装するクラス名に置き換えられます。障害Beanは、障害の情報を含むJava Beanであり、Webサービスクライアントが障害の原因を知るために使用します。

そして、あなたのマッピングがあります。のコンテキストで上記の署名の実装を指定するだけで、SOAPAPI@WebFaultはこれらを適切にマッピングする必要があります。明らかに、リンクには詳細が含まれています。

于 2012-04-15T21:45:23.767 に答える