如何从REST端点捕获JsonParseException

时间:2018-05-14 15:10:35

标签: jackson jersey jackson-databind

我有一个这样的端点:

@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?

1 个答案:

答案 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模块附带的JsonMappingExceptionMapperjackson-jaxrs-json-provider的行为。有关详细信息,请参阅此answer