当前位置:  开发笔记 > 前端 > 正文

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

如何解决《泽西岛无法抓住任何杰克逊的例外》经验,为你挑选了1个好方法。

对于我的REST api,我使用jersey和ExceptionMapper来捕获全局异常.它适用于我的应用程序抛出的所有异常,但我无法捕获杰克逊抛出的异常.

例如,我的一个端点接受包含枚举的对象.如果请求中的Json有一个不在enum 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 {
  @Override
  public Response toResponse(JsonMappingException e) {
    ....
  }
}

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

为了捕捉这些例外,我们还需要做些什么吗?

编辑 注意:我有jus尝试不太通用而不是JsonMappingException我使用InvalidFormatException在这种情况下调用映射器.但我仍然不明白,因为InvalidFormatException扩展了JsonMappingException,也应该被调用



1> 小智..:

有同样的问题.
问题是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: jersey.config.server.disableAutoDiscovery true

    使用代码:resourceConfig.property(CommonProperties.FEATURE_AUTO_DISCOVERY_DISABLE, true);其中resourceConfig的类型为org.glassfish.jersey.server.ServerConfig.


您也可以编写自己的特定映射器:

public class MyJsonMappingExceptionMapper implements ExceptionMapper

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

推荐阅读
pan2502851807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有