我的项目使用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?
我找到了适合我的解决方案。在自定义映射器上 使用javax.annotation.Priority,以使其覆盖Jackson的默认映射器,例如:
javax.annotation.Priority
@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有一些预定义的优先级常量。
javax.ws.rs.Priorities