2012-05-18 10 views
28

Sono stato abbastanza irragionevole da passare alla configurazione dei bean a molla tramite annotazioni e non con bean xml puri e ora sono di fronte alle conseguenze.Come configurare MappingJacksonHttpMessageConverter mentre si utilizza la configurazione basata su annotazione di primavera?

ho configurare i canali REST utilizzando

<mvc:annotation-driven /> 

ora voglio semplicemente configurare il MappingJacksonHttpMessageConverter per l'output JSON solo questi campi con valori non nulli. Ho provato quanto segue:

<bean id="jsonHttpMessageConverter" 
    class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
    <property name="prefixJson" value="false" /> 
    <property name="supportedMediaTypes" value="application/json" /> 
    <property name="objectMapper"> 
     <bean class="org.codehaus.jackson.map.ObjectMapper"> 
      <property name="serializationInclusion" value="NON_NULL"/> 
     </bean> 
    </property> 
</bean> 

I bean vengono creati, ma un'altra istanza di convertitore viene creata e utilizzata nei canali. Così ho provato il modo con @Configuration e @Bean descritto in this Stackoverflow question, ma ancora serializzazione JSON utilizza la propria configurazione.

Infine ho provato a iniettare il mapper tramite

@Autowired 
private MappingJacksonHttpMessageConverter jacksonConverter; 

ma ho finito con NoSuchBeanDefinitionException. Quindi ora sono fuori dalle opzioni e quindi sto chiedendo qualche idea qui. Come controllare e configurare il mapper utilizzato dal framework?

+0

provare a cambiare il nome del campo cablata a '' jsonHttpMessageConverter' come @Autowired privato MappingJacksonHttpMessageConverter jsonHttpMessageConverter; ' –

risposta

55

Utilizzare il metodo WebMvcConfigurer.configureMessageConverters():

Configurare le HttpMessageConverters di utilizzare [...] Se non convertitori messaggi vengono aggiunti all'elenco, convertitori di default vengono aggiunti, invece.

Con @Configuration si hanno:

@Configuration 
class MvcConf extends WebMvcConfigurationSupport { 
    protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(converter()); 
     addDefaultHttpMessageConverters(converters); 
    } 

    @Bean 
    MappingJacksonHttpMessageConverter converter() { 
     MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter() 
     //do your customizations here... 
     return converter; 
    } 
} 

Chiama per addDefaultHttpMessageConverters() è necessario perché i valori di default non vengono applicate quando si utilizza convertitori personalizzati.

NOTA IMPORTANTE È necessario rimuovere @EnableWebMvc per la configurazione dei convertitori se si estende WebMvcConfigurationSupport.

+1

ancora, nel mio caso, viene creato solo un altro esempio di MappingJacksonHttpMessageConverter e non è quello che viene utilizzato in seguito –

+1

Sembra dipendere dall'ordine di aggiungere il convertitore rispetto a quelli di default. Quando aggiungo il mio convertitore prima come descritto sopra, funziona per me. – user405935

+0

Inoltre, non dimenticare le ** versioni ** devono essere compatibili. Sto usando Spring 4. * e ho provato per ore a configurarlo con Jackson 1. * - non ha funzionato. Poi, ho scoperto, hanno cambiato l'artefatto in com.fasterxml.jackson.core: jackson-databind in Jasckson 2. *. Ho cambiato le dipendenze -> ha funzionato come un fascino (senza configureMessageConverters);) – pkopac

25

La personalizzazione della configurazione del servlet mvc molla solo nel codice java può essere eseguita in diversi modi.

Quello più semplice sembra essere estendere la classe @Configuration annotato con WebMvcConfigurerAdapter:

@Configuration 
@EnableWebMvc 
public class ApplicationSpringConfig extends WebMvcConfigurerAdapter { 
    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(converter()); 
    } 

    @Bean 
    MappingJackson2HttpMessageConverter converter() { 
     // [...] 
    } 
} 

Si noti che questo è molto simile l'esempio fornito dalla risposta di Tomasz Nurkiewicz.

Tuttavia utilizzare WebMvcConfigurationSupport anziché WebMvcConfigurerAdapter è più appropriato per le personalizzazioni avanzate. Questo è il caso se è stato necessario aggiungere anche i convertitori predefiniti.

Vedere la documentazione Primavera Customizing the Provided Configuration

+0

Risposta più completa della risposta accettata. –

+2

Perché il metodo 'converter()' deve essere contrassegnato con '@ Bean'? –

+1

JavaDoc: che aggiungendo convertitori all'elenco, disattiva la registrazione del convertitore predefinito. Per aggiungere semplicemente un convertitore senza influire sulla registrazione predefinita, prendere in considerazione l'utilizzo del metodo extendMessageConverters (java.util.List). – xedo

Problemi correlati