1

我做了一个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我的代码抛出的 s,但是如果我发送一个带有 JSON 值的请求,该值IllegalStateException在我的对象创建时抛出一个,这ExceptionMapper将被忽略并且我得到一个400 Bad Request响应。

有趣的是这个响应不是传统的 Tomcat HTML 格式的响应,它只是纯文本。它只是说:

无法构造 `com.example.vo.AutoValue_Customer$Builder` 的实例,问题:名字为空或为空。在 [来源:(org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream);行:14,列:1]

我认为这可能会使 Jersey 短路,但我@PreMatching ContainerRequestFilter是事先执行的,所以我真的不知道为什么400Response 不是来自 Tomcat 的传统 HTML。

为什么会这样?我能做些什么来捕捉这个并返回我自己的响应?

4

1 回答 1

0

正如 Paul Samsotha 在评论中所说,JacksonFeaturejersey-media-json-jackson包中定义了一些ExceptionMappers,likeJsonMappingExceptionJsonParseException。解决办法是自己创建,在里面ResourceConfig注册JacksonFeature,最后注册,否则不行。

例如

@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);
    }
}
于 2019-06-30T22:36:31.633 回答