2015-08-10 20 views
5

C'è un modo per impostare HttpMessageConverter solo per determinati pacchetti nel mio progetto usando spring?Impostare un ObjectMapper diverso per determinati pacchetti 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); 
      } 
     } 
    } 

Usando questo PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES, cambia tutte le risposte a progetto e voglio che questo di applicare solo in qualche dto.

+0

Sarebbe bello se potessi mettere un'annotazione a package.info con PropertyNamingStrategy: D – nachokk

+0

Non sono sicuro che sia possibile. Idea: aggiungi la tua estensione di 'MappingJacksonHttpMessageConverter' che sovrascrive' canRead' e 'canWrite' solo per abbinare le classi in alcuni pacchetti. – hzpz

risposta

2

Ecco un esempio della soluzione propongono per hzpz: convertitore

personalizzato:

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

configurazione

@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; 
    } 
} 
Problemi correlati