针对API的不同部分的多个ObjectMapper

时间:2017-10-09 00:51:41

标签: java spring spring-mvc jackson

目前我的Spring Boot App中有一个<d:Style.DataContext>配置:

@Bean

是否可以为API的不同部分使用不同的ObjectMapper? 我感兴趣的是,例如,为API的不同部分提供不同的属性命名策略。我希望我的API的一部分(例如@Bean public ObjectMapper objectMapper() { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(MapperFeature.DEFAULT_VIEW_INCLUSION, true); mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE); mapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY); mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); return mapper; } )与/api/v1/snake/**及其中的一部分(例如SNAKE_CASE)一起使用/api/v1/camel/**

谢谢!

1 个答案:

答案 0 :(得分:1)

如果API的两个部分都没有处理相同的域对象,那么您可以通过提供覆盖{{1}的MappingJackson2HttpMessageConverter的{​​{1}}实现来实现此目标。 }和canRead方法。这里是一个使用必须序列化的对象的基础包的例子:

自定义转换器:

canWrite

<强>配置

public class CustomConverter extends MappingJackson2HttpMessageConverter {

    private String basePackage;

    public CustomConverter(String basePackage) {
        this.basePackage = basePackage;
    }

    @Override
    public boolean canRead(Type type, Class<?> contextClass, MediaType mediaType) {
        if (contextClass.getName().startsWith(basePackage)) {
            return super.canRead(type, contextClass, mediaType);
        }
        return false;
    }

    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        if (clazz.getName().startsWith(basePackage)) {
            return super.canWrite(clazz, mediaType);
        }
        return false;
    }
}