我有一个这样的端点:
@POST
public Response update(MyDocument myDocument){}
如果请求无效,我的服务器会得到一些很长的日志:
javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: com.fasterxml.jackson.core.JsonParseException: Unexpected character....
...
Caused by...
...
Caused by...
异常很难完全避免,所以我想知道如何捕获JsonParseException?
答案 0 :(得分:4)
为ExceptionMapper
实施JsonParseException
。它允许您将给定的异常映射到响应。请参阅以下示例:
@Provider
public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
@Override
public Response toResponse(JsonParseException exception) {
return Response.status(Response.Status.BAD_REQUEST)
.entity("Cannot parse JSON")
.type(MediaType.TEXT_PLAIN)
.build();
}
}
然后在ResourceConfig
子类中注册绑定优先级(参见注释):
@ApplicationPath("api")
public class JerseyConfig extends ResourceConfig {
public JerseyConfig() {
register(JsonParseExceptionMapper.class, 1);
}
}
如果您没有使用ResourceConfig
子类,则可以使用ExceptionMapper
注释@Priority
(请参阅注释):
@Provider
@Priority(1)
public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
...
}
注1:您可能还会发现为ExceptionMapper
创建另一个JsonMappingException
很有帮助。
注2:如果您已注册ExceptionMapper
并且想要覆盖<,则优先考虑您自己的JacksonFeature
/ em> JsonParseExceptionMapper
模块附带的JsonMappingExceptionMapper
和jackson-jaxrs-json-provider
的行为。有关详细信息,请参阅此answer。