小编典典

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

spring-boot

我的项目使用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");
    }
}

我确定映射器注册是可以的,因为此程序包中的其他自定义映射器正在工作,但是Jersey标准的JsonParseExceptionMapper遮盖了JsonParseException的映射器。

如何在实现中覆盖标准的Jackson Jackson JsonParseExceptionMapper?


阅读 292

收藏
2020-05-30

共1个答案

小编典典

我找到了适合我的解决方案。在自定义映射器上
使用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有一些预定义的优先级常量。

2020-05-30