的API

2017-10-09 18 views
0

的不同部分的多个ObjectMappers目前我在春天启动一个应用程序配置@Bean这样的:的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的不同部位不同ObjectMappers? 我有兴趣举例说明API的不同部分有不同的属性命名策略。我希望我的API的一部分(例如/api/v1/snake/**)与SNAKE_CASE及其一部分(例如/api/v1/camel/**)一起使用以与LOWER_CAMEL_CASE一起使用。

谢谢!

回答

1

如果API的两个部分不会处理相同的域对象,你就可以通过提供自己实现MappingJackson2HttpMessageConverter是覆盖canReadcanWrite方法来做到这一点。这里使用对象的基础包必须被序列化的例子:

自定义转换器:

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

配置

@Configuration 
public class Configuration { 

    @Bean 
    public MappingJackson2HttpMessageConverter camelCaseConverter() { 
     MappingJackson2HttpMessageConverter converter = new CustomConverter("package.camel"); 
     converter.setObjectMapper(camelCaseObjectMapper()); 
     return converter; 
    } 

    @Bean 
    public MappingJackson2HttpMessageConverter snakeCaseConverter() { 
     MappingJackson2HttpMessageConverter converter = new CustomConverter("package.snake"); 
     converter.setObjectMapper(snakeCaseObjectMapper()); 
     return converter; 
    } 

    @Bean 
    public ObjectMapper camelCaseObjectMapper() { 
     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.LOWER_CAMEL_CASE); 

     return mapper; 
    } 

    @Bean 
    public ObjectMapper snakeCaseObjectMapper() { 
     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; 
    } 
} 
+0

谢谢!我会很快尝试你的解决方案! –