java – Jackson JsonParseExceptionMapper和JsonMappingExceptionMapper阴影自定义映射器

我的项目使用Spring Boot Jersey 2.

我为JsonParseException创建了自定义Jackson映射器,但它没有被调用,而是使用标准的Jackson JsonParseExceptionMapper.

我的自定义映射器:

 package com.rmn.gfc.common.providers;
 import ...

 @Provider
 public class JsonParseExceptionHandler implements ExceptionMapper<JsonParseException> { 
    @Override
    public Response toResponse(JsonParseException exception) {
        return Response
                .status(Response.Status.BAD_REQUEST)
                //  entity ...
                .build();
    }
}

我像这样注册我的映射器:

@Component
public class OrderServiceResourceConfig extends ResourceConfig {
    public OrderServiceResourceConfig() {
        packages("com.rmn.gfc.common.providers");
    }
}

我确信mapper注册很好,因为这个包中的其他自定义映射器正在工作,但是JsonParseException的一个被Jersey标准JsonParseExceptionMapper遮蔽.

我怎么能用我的实现覆盖标准的Jackson JsonParseExceptionMapper?

解决方法:

我发现解决方案对我来说很好.
在自定义映射器上使用javax.annotation.Priority使其覆盖Jackson默认映射器,例如:

@Provider
@Priority(1)
public class JsonParseExceptionHandler implements ExceptionMapper<JsonParseException> {
    // ...
}

或者,如果您通过ResourceConfig注册JAX-RS组件,您可以指定如下优先级:

public class MyResourceConfig extends ResourceConfig {
    public MyResourceConfig() {
        register(JsonMappingExceptionHandler.class, 1);
        register(JsonParseExceptionHandler.class, 1);
        // ...
    }
}

较低的数字是最高优先级.
javax.ws.rs.Priorities有一些预定义的优先级常量.

上一篇:java – JAX-RS / Jersey中vararg数组的路径段序列?


下一篇:java – 一个web.xml中的多个jersey servlet