11

对于我的 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 并且也应该被调用

4

3 回答 3

10

有同样的问题。
问题是 JsonMappingExceptionMapper 在您的映射器之前启动。

实际的异常属于com.fasterxml.jackson .databind.exc.InvalidFormatException类,映射器定义了com.fasterxml.jackson .jaxrs.base.JsonMappingException,因此它更具体地针对异常。
你看,Jersey 的异常处理程序会寻找最准确的处理程序(参见 org.glassfish.jersey.internal.ExceptionMapperFactory#find(java.lang.Class, T))。

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

  1. 使用 XML: <init-param> <param-name>jersey.config.server.disableAutoDiscovery</param-name> <param-value>true</param-value> </init-param>

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


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

public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException>

但我认为这是过度杀戮。

于 2016-01-19T13:23:07.833 回答
5

嗨,现在似乎退出了不需要禁用 Jersey AUTO_DISCOVERY 功能的替代答案。

只需使用 @Priority(1) 注释来注释您自己的异常映射器。数字越小,优先级越高。由于杰克逊自己的映射器没有任何优先注释,你的将被执行:

@Priority(1)
public class MyJsonMappingExceptionMapper implements ExceptionMapper<JsonMappingException>
于 2019-02-19T16:02:37.377 回答
2

从版本 2.29.1 [1] 开始,如果您正在注册JacksonFeature,您现在可以在不注册异常映射器 [2] 的情况下这样做:

register(JacksonFeature.withoutExceptionMappers());

[1] https://github.com/eclipse-ee4j/jersey/pull/4225

[2] https://eclipse-ee4j.github.io/jersey.github.io/apidocs/2.34/jersey/org/glassfish/jersey/jackson/JacksonFeature.html#withoutExceptionMappers--

于 2021-10-28T16:22:29.990 回答