2015-08-10 12 views
5

Gibt es eine Möglichkeit, einen HttpMessageConverter für nur bestimmte Pakete in meinem Projekt mit Feder zu setzen?Einen anderen ObjectMapper für ein bestimmtes Paket festlegen Spring MVC

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackageClasses = MyConfig.class) 
public class MyConfig 
    extends WebMvcConfigurerAdapter { 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 

     for (HttpMessageConverter<?> converter : converters) { 
      if (converter instanceof MappingJacksonHttpMessageConverter) { 
       ObjectMapper objectMapper = new ObjectMapper(); 
       objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
       objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES); 
       objectMapper.setSerializationInclusion(Inclusion.NON_NULL); 
       ((MappingJacksonHttpMessageConverter) converter).setObjectMapper(objectMapper); 
      } 
     } 
    } 

diesen PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES Mit ändert alle Antworten in Projekt und ich möchte dies nur in einiger dto anzuwenden.

+0

Es wäre toll, wenn ich eine Anmerkung setzen könnte bei package.info mit PropertyNamingStrategy: D – nachokk

+0

Ich bin mir nicht sicher, ob das möglich ist. Idee: Fügen Sie Ihre eigene Erweiterung von 'MappingJacksonHttpMessageConverter' hinzu, die' canRead' und 'canWrite' überschreibt, um nur Klassen in bestimmten Paketen zu entsprechen. – hzpz

Antwort

2

Hier ein Beispiel für die Lösung vorschlagen, die von hzpz:

Individuelle 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 CustomConfig { 

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

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

    @Bean 
    public ObjectMapper firstObjectMapper() { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.setPropertyNamingStrategy(PropertyNamingStrategy.LOWER_CAMEL_CASE); 
     return mapper; 
    } 

    @Bean 
    public ObjectMapper secondObjectMapper() { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); 
     return mapper; 
    } 
} 
Verwandte Themen