Jackson JsonParseExceptionMapper和JsonMappingExceptionMapper阴影自定义映射器 [英] Jackson JsonParseExceptionMapper and JsonMappingExceptionMapper shadows custom mapper

查看:177
本文介绍了Jackson JsonParseExceptionMapper和JsonMappingExceptionMapper阴影自定义映射器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的项目使用Spring Boot + Jersey 2.



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

我的自定义映射器:

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

@Provider
公共类JsonParseExceptionHandler实现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);
}
}

我确信映射器注册正常,因为其他自定义来自这个包的mappers正在工作,但是一个用于JsonParseException的被Jersey标准的JsonParseExceptionMapper遮蔽。



我如何用我的实现覆盖标准的Jackson JsonParseExceptionMapper?

解决方案

我发现解决方案对我来说很好。

使用 javax。自定义映射器上的annotation.Priority ,使其覆盖杰克逊默认映射器,例如:

  @Provider 
@Priority(1)
公共类JsonParseExceptionHandler实现ExceptionMapper< JsonParseException> {
// ...
}

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

 公共类MyResourceConfig扩展ResourceConfig {
public MyResourceConfig( ){
寄存器(JsonMappingExceptionHandler.class,1);
寄存器(JsonParseExceptionHandler.class,1);
// ... ...
}
}

较低编号为最高优先级。

javax.ws.rs.Priorities 有一些预定义的优先级常量。


My project uses Spring Boot + Jersey 2.

I created custom Jackson mapper for JsonParseException, but it didn't get called, standard Jackson JsonParseExceptionMapper used instead.

My custom mapper:

 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();
    }
}

I register my mapper like this:

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

I am sure that mapper registration is fine because other custom mappers from this package is working, but one for JsonParseException is shadowed by Jersey standard JsonParseExceptionMapper.

How could I override standard Jackson JsonParseExceptionMapper with my implementation?

解决方案

I found solution that is fine for me.
Use javax.annotation.Priority on your custom mapper to make it override Jackson default mapper, e.g.:

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

OR , if you register JAX-RS components via ResourceConfig, you can specify priority like this:

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

The lower number the highest priority.
javax.ws.rs.Priorities has some predefined constants for priorities.

这篇关于Jackson JsonParseExceptionMapper和JsonMappingExceptionMapper阴影自定义映射器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆