json - Jersey 无法捕获任何 jackson 异常

标签 json exception jersey jackson exceptionmapper

对于我的REST API,我正在使用jersey和ExceptionMapper来捕获全局异常。
我的应用程序抛出的所有异常都可以正常工作,但是我无法捕捉到 jackson 抛出的异常。

例如,我的一个端点接受一个包含枚举的对象。如果请求中的Json的值不在枚举 Jersey 中,则抛出此异常

Can not construct instance of my.package.MyEnum from String value 'HELLO': value not one of declared Enum instance names: [TEST, TEST2]
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@5922e236; line: 3, column: 1] (through reference chain: java.util.HashSet[0]->....)

即使我已经创建了这个映射器
@Provider
@Component
public class JacksonExceptionMapper implements ExceptionMapper<JsonMappingException> {
  @Override
  public Response toResponse(JsonMappingException e) {
    ....
  }
}

代码永远不会到达此映射器。

为了捕获这些异常,我们需要做些什么吗?

编辑
注意:我已经尝试过让通用性降低一些,并且在这种情况下,我使用InvalidFormatException而不是JsonMappingException来调用映射器。但是我还是不明白,因为InvalidFormatException扩展了JsonMappingException,也应该被调用

最佳答案

遇到了同样的问题。
问题是JsonMappingExceptionMapper在您的映射器之前启动。实际的异常是 com.fasterxml.jackson类 .databind.exc.InvalidFormatException的类型,而映射器定义了 com.fasterxml.jackson .jaxrs.base.JsonMappingException,因此它更特定于异常。
您会看到,Jersey的异常处理程序看起来会找到最准确的处理程序(请参见org.glassfish.jersey.internal.ExceptionMapperFactory#find(java.lang.Class,T))。

要覆盖此行为,只需禁用映射器即可:

  • 使用XML:<init-param> <param-name>jersey.config.server.disableAutoDiscovery</param-name> <param-value>true</param-value> </init-param>
  • 使用代码:resourceConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);其中resourceConfig的类型为org.glassfish.jersey.server.ServerConfig。

  • 您还可以编写自己的特定映射器:
    public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException>
    

    但是我认为这是一个过度杀戮。

    关于json - Jersey 无法捕获任何 jackson 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34615242/

    相关文章:

    java - 使用不同的 QueryParams 重载 REST 端点

    ios - 如何将 json 解码为键中有空格的结构/类对象?

    json - 解码后的 JSON 字段仅给出 nil 值,无法存储到变量中

    c++ - 空表达式 "throw"是什么意思?

    python - 处理多个Try/Except语句

    java - 在 DDD 对象中混合 JSR 303 Bean 验证和手册(通过 Apache Commons)

    python - 使用 unicode 字符解码 JSON 数组

    Java:在 Restful 服务中创建包含多个值的 JSON 响应

    c# - 如何读取 StackTrace?

    java - 如何在 Dropwizard( Jersey )中记录 JSON 响应