【发布时间】:2016-01-05 15:24:52
【问题描述】:
对于我的 REST api,我使用 jersey 和 ExceptionMapper 来捕获全局异常。 它适用于我的应用程序抛出的所有异常,但我无法捕获杰克逊抛出的异常。
例如,我的一个端点接受一个包含枚举的对象。如果请求中的 Json 具有不在枚举球衣中的值,则抛出此异常
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 并且也应该被调用
【问题讨论】:
-
什么版本的杰克逊?
-
jersey-media-json-jackson (2.22.1) 但我也有 com.fasterxml.jackson.core jackson-annotations (2.6.3)
-
杰克逊已经有一个mapper for this exception。这就是可能正在使用的东西。
-
有趣的是,事实上异常发生在哪里......我真的不喜欢我的异常(包含所有名称和包名称)像这样被泄露,有什么办法可以覆盖它吗?
-
我假设您正在注册
JacksonFeature.class,所以泽西岛使用杰克逊。如果是这样的话,Jackson 正在注册它自己的映射器。您可以尝试注册JacksonJaxbJsonProvider.class,而不是注册它自己的异常映射器。这应该可以解决问题。
标签: json exception jersey jackson exceptionmapper