5

NotFoundException 、BadRequestException、

そして、それらのそれぞれに対して、 NotFoundExceptionMapper 、 BadRequestExceptionMapper、およびGenericExceptionMapperのような独自の ExceptionMapper を実装しました。

@Provider
public class GenericExceptionMapper implements ExceptionMapper<Throwable> {


    @Override
    @Produces( {MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON} )
    public Response toResponse(Throwable ex) {
        ErrorResponseWrapper errorResponse = new ErrorResponseWrapper(ex.getMessage(), 500, "");
        return Response.status(Status.INTERNAL_SERVER_ERROR).entity(errorResponse).build();
    }
}

まず、ここでの問題は、GenericExceptionMapperが期待どおりに機能せず、JAX-RS によってスローされた一般的な例外をキャッチしないことです。そのようなマッパーによってキャッチされる各例外は、 getResource() スローなどのメソッドから早期に明示的にスローされる必要があると考えているためです。いくつかの例外 {

さらに問題は、RestEasyでは例外マッパーをweb.xmに登録する必要があることです。下記参照:

 <!-- Custom exception handling provider -->
    <context-param>
        <param-name>resteasy.providers</param-name>
        <param-value>pl.salonea.jaxrs.exceptions.GenericExceptionMapper</param-value>
    </context-param>

定義した各カスタム ExceptionMapper を登録できない (または登録方法がわからない) ため、別の問題があります。SINGLE カスタム ExceptionMapper しか登録できません。 それらをすべて登録するにはどうすればよいですか?つまり、NotFoundExceptionMapper、BadRequestExceptionMapper などです。

したがって、各例外は Generic Exception Mapper によってのみマップされます。これが最初の問題です。

これは RESTEasy の制限ですか? いくつかのチュートリアルのジャージーでは、そのような ExceptionMappers を登録する必要性を見ていませんが、複数の例外 Mapper が存在する可能性があるかどうかもわかりません。

私の頭に浮かんだ別の解決策(回避策)は、単一の GenericExceptionMapper を持ち、メソッドtoResponse(Throwable ex)で次のようなチェックを行うことです。

if(ex instanceof NotFoundException) { // send response type 1 
if(ex instanceof BadRequestException) { // send response type 2

助けてくれてありがとう

4

0 に答える 0