泽西无法抓住任何杰克逊例外

对于我的REST api,我使用jersey和ExceptionMapper来捕获全局异常。 它运行良好,我的应用程序抛出异常,但我无法捕捉杰克逊引发的异常。

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

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) {
    ....
  }
}

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

为了赶上这些例外,我们需要做些什么?

编辑注:我有绝对尝试不是一般的,而不是JsonMappingException我使用InvalidFormatException在这种情况下映射器被调用。 但是我仍然不明白,因为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>
    

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

    链接地址: http://www.djcxy.com/p/89521.html

    上一篇: Jersey unable to catch any Jackson Exception

    下一篇: How to close a branch WITHOUT removing it from history in git?