2017-10-09 2 views
0

Zur Zeit habe ich eine @Bean Konfiguration in meinem Frühjahr Boot-App wie folgt aus:Mehrere ObjectMappers für verschiedene Teile des 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; 
} 

Ist es möglich, verschiedene ObjectMappers für verschiedene Teile der API haben? Ich bin zum Beispiel daran interessiert, unterschiedliche Eigenschaften Benennungsstrategie für verschiedene Teile der API zu haben. Ich möchte, dass ein Teil meiner API (z. B. /api/v1/snake/**) mit SNAKE_CASE und einem Teil davon (z. B. /api/v1/camel/**) mit LOWER_CAMEL_CASE arbeitet.

Danke!

Antwort

1

Wenn beiden Teile der API nicht mit den gleichen Domain-Objekten zu tun, werden Sie in der Lage sein, es zu tun, indem Sie Ihre eigene Implementierung von MappingJackson2HttpMessageConverter vorausgesetzt, dass die canRead und canWrite Methoden überschreiben. Hier ist ein Beispiel mit dem Basispaket des Objekts, das serialisiert werden muß:

Individuellen Konverter:

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

Konfiguration

@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

Dank! Ich werde deine Lösung bald versuchen! –

Verwandte Themen