Джерси игнорирует ExceptionMapper - PullRequest
0 голосов
/ 30 июня 2019

Я сделал ExceptionMapper для перехвата и регистрации всех исключений, например:

@Provider
public class CatchAllExceptionsMapper implements ExceptionMapper<Throwable> {
    private static final Logger LOG = LoggerFactory.getLogger(CatchAllExceptionsMapper.class);
    @Override
    public Response toResponse(Throwable exception) {
        LOG.error("Exception not catched!", exception);
        return Response.serverError().build();
    }
}

Он перехватывает Exception с моего кода, но если я отправляю запрос со значением JSON, которое выбрасываетIllegalStateException при создании моего объекта, это ExceptionMapper игнорируется, и я получаю ответ 400 Bad Request.

Забавно, что этот Ответ не является традиционным Ответом Tomcat в формате HTML, это просто обычный текст.В нем просто сказано:

Невозможно создать экземпляр `com.example.vo.AutoValue_Customer $ Builder`, проблема: имя пустое или пустое.в [Source: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor $ UnCloseableInputStream);строка: 14, столбец: 1]

Я думал, что это может быть что-то короткое замыкание Джерси, но мой @PreMatching ContainerRequestFilter выполняется заранее, поэтому я действительно понятия не имею, почему 400 Ответ не является традиционным HTML от Tomcat.

Почему это происходит?Что я могу сделать, чтобы поймать это и вернуть мой собственный ответ?

1 Ответ

0 голосов
/ 01 июля 2019

Как сказал Пол Самсота в комментариях, JacksonFeature из пакета jersey-media-json-jackson определяют некоторые ExceptionMapper s, например JsonMappingException и JsonParseException.Решение состоит в том, чтобы создать свои собственные, зарегистрировать их в ResourceConfig и зарегистрировать JacksonFeature last, иначе это не будет работать.

например,

@Provider
@Priority(1) // hack for overriding other implementations.
public class JsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException> {
    @Override
    public Response toResponse(JsonMappingException exception) {        
        return Response.status(Status.BAD_REQUEST).build();
    }
}


@Provider
@Priority(1) // hack for overriding other implementations.
public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
    @Override
    public Response toResponse(JsonParseException exception) {        
        return Response.status(Status.BAD_REQUEST).build();
    }
}

public class MyResourceConfig extends ResourceConfig {
    public MyResourceConfig() {
        register(CatchAllExceptionsMapper.class);
        register(JsonMappingExceptionMapper.class);
        register(JsonParseExceptionMapper.class);
        register(JacksonFeature.class);
    }
}
...