如何从REST端点捕获JsonParseException

Spi*_*der 2 jersey jackson jackson-databind

我有一个这样的端点:

@POST
public Response update(MyDocument myDocument){}
Run Code Online (Sandbox Code Playgroud)

如果请求无效,我的服务器将获得一些较长的日志,如下所示:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: com.fasterxml.jackson.core.JsonParseException: Unexpected character....
...
Caused by...
...
Caused by...
Run Code Online (Sandbox Code Playgroud)

很难完全避免该异常,所以我想知道如何捕获JsonParseException?

cas*_*lin 5

实施ExceptionMapperfor 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在子类中以绑定优先级注册它(请参见注释)ResourceConfig

@ApplicationPath("api")
public class JerseyConfig extends ResourceConfig {

    public JerseyConfig() {
        register(JsonParseExceptionMapper.class, 1);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的不是ResourceConfig子类,你可以注释ExceptionMapper(见注)@Priority

@Provider
@Priority(1)
public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

注意1:您可能还会发现为创建另一个ExceptionMapper帮助JsonMappingException

注2:给予优先考虑到自己ExceptionMapper■如果你有特别有用JacksonFeature注册并要重写的行为JsonParseExceptionMapper,并JsonMappingExceptionMapper附带jackson-jaxrs-json-provider模块。有关更多详细信息,请参见此答案