0

EJB サービスの REST ファサードを開発しています。つまり、EJB を呼び出し、結果を REST 呼び出し元が理解できる表現に変換してから (json または xml として) 返します。そのすべてが見事に機能します。しかし、EJB サービスはさまざまな例外をスローします。たとえば、結果が見つからない場合やその他のいくつかのケースです。これらを REST 呼び出し元に伝播させたくないので、ExceptionMapper を実装しました。

public class EjbExceptionMapper implements ExceptionMapper<EJBException> {

    private static final Logger logger = LoggerFactory.getLogger(EjbExceptionMapper.class);

    @Override
    public Response toResponse(final EJBException exception) {
        ResponseBuilder result = Response.status(Status.BAD_REQUEST);
        logger.debug("Bad request:", exception);
        if (exception.getCause() != null) {
            final Throwable cause = exception.getCause();
            if (cause instanceof NoDeliveryFoundException) {
                logger.debug("Found NoDeliveryFoundException:", cause);
                result = Response.status(Status.NO_CONTENT).entity(cause.getMessage());
            }
        }
        return result.build();
    }
}

私の EJB サービスからのすべての例外は として到着しjavax.ejb.EJBException、この Mapper はアプリケーションのさまざまなカスタム例外を原因として、これを問題なくキャッチできます。EJBException の原因の種類に応じて異なるレスポンスを返す予定です。デバッグに使用されるロガー呼び出しは両方とも、原因として NoDeliveryFoundException が発生した場合に実行されるため、実行されたことはわかっています (Mapper は正しく登録され、マッピングに使用されます) が、クライアントには応答がありません。

toResponse() メソッドが null を返し、カスタム ビルドされた Response ではないかのように、基盤となるサービスで EJBException につながる呼び出し (したがって、この ExceptionMapper の使用) は、Response にまったくつながりません。

応答を返す直前にログに記録することさえしました。それは存在し、私が期待するものを含んでいるので、toResponse メソッドによって返されることは間違いありません。それでも、私のクライアントは応答を受け取りません。

だから今、私は困惑しており、検索しても同様の問題を説明している人を見つけることができなかったので、親愛なるSOに頼ります。;)

4

1 に答える 1

3

-methodtoResponseには競合するロジックが含まれています。

Response.status(Status.NO_CONTENT).entity(cause.getMessage());

ここでは、HTTP ステータス コードを割り当てて204 No Contentいますが、応答も追加しています。204 No Contentステータスを設定して、同時にレスポンスボディを返すことはできません。

また、Exception#getCause()が null の場合、またはのインスタンスでないNoDeliveryFoundException場合、応答本文は空です。

これがあなたの問題の原因でしょうか?

于 2013-09-22T09:21:07.380 に答える