【问题标题】:How to catch JsonParseException from REST endpoint如何从 REST 端点捕获 JsonParseException
【发布时间】:2018-10-24 07:29:15
【问题描述】:

我有一个这样的端点:

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

【问题讨论】:

    标签: jackson jersey jackson-databind


    【解决方案1】:

    JsonParseException 实现ExceptionMapper。它将允许您将给定的异常映射到响应。请参见下面的示例:

    @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子类,你可以用@Priority注释ExceptionMapper(见注释)

    @Provider
    @Priority(1)
    public class JsonParseExceptionMapper implements ExceptionMapper<JsonParseException> {
        ...
    }
    

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

    注意 2:如果您已注册 JacksonFeature 并且想要覆盖 JsonParseExceptionMapperJsonMappingExceptionMapper 的行为与 jackson-jaxrs-json-provider 模块一起提供。有关详细信息,请参阅此answer

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多