2012-05-18 18 views
28

No fui lo suficientemente razonable para entrar a configurar beans de primavera a través de anotaciones y no granos puros xml y ahora estoy enfrentando las consecuencias.¿Cómo se configura MappingJacksonHttpMessageConverter utilizando la configuración basada en la anotación de primavera?

puedo configurar canales REST utilizando

<mvc:annotation-driven /> 

Ahora quiero simplemente configurar el MappingJacksonHttpMessageConverter a la salida de JSON sólo estos campos que tienen valores no nulos. He intentado lo siguiente:

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

Se crean los beans, pero se crea otra instancia de convertidor y se utiliza en los canales. Así que probé el camino con @Configuration y @Bean descritos en this Stackoverflow question, pero la serialización todavía json usa su propia configuración.

Finalmente he tratado de inyectar el asignador través

@Autowired 
private MappingJacksonHttpMessageConverter jacksonConverter; 

pero he terminado con NoSuchBeanDefinitionException. Así que ahora estoy sin opciones y por lo tanto estoy pidiendo cualquier idea aquí. ¿Cómo controlar y configurar el asignador utilizado por el marco?

+0

trate de cambiar el nombre del campo por cable a '' jsonHttpMessageConverter' como @Autowired MappingJacksonHttpMessageConverter jsonHttpMessageConverter privado; ' –

Respuesta

55

Uso del método de WebMvcConfigurer.configureMessageConverters():

Configurar las HttpMessageConverters a utilizar [...] Si no hay convertidores de mensajes se añaden a la lista, se añaden los conversores por defecto en su lugar.

Con @Configuration tiene:

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

llamada a addDefaultHttpMessageConverters() es necesario porque los valores predeterminados no se aplican cuando se utilizan convertidores personalizados.

NOTA IMPORTANTE Debe eliminar @EnableWebMvc para que se configuren sus convertidores si extiende WebMvcConfigurationSupport.

+1

todavía, en mi caso, sólo se crea otra instancia de MappingJacksonHttpMessageConverter y no es el que se usa luego –

+1

Parece depender del orden de agregar su convertidor a los valores predeterminados. Cuando agrego mi propio convertidor primero como se describe arriba, funciona para mí. – user405935

+0

Además, no olvide que las ** versiones ** deben ser compatibles. Estoy usando Spring 4. * e intenté durante horas configurarlo con Jackson 1. * - no funcionó. Luego, descubrí, cambiaron el artefacto a com.fasterxml.jackson.core: jackson-databind en Jasckson 2. *. Cambié las dependencias -> funcionó como un amuleto (sin configureMessageConverters);) – pkopac

25

La personalización de la configuración del servlet del mvc de muelles solo en código java se puede realizar de múltiples maneras.

la más simple parece ser la ampliación de su clase @Configuration anotado con WebMvcConfigurerAdapter:

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

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

Tenga en cuenta que esto es muy parecido al ejemplo proporcionado por la respuesta de Tomasz Nurkiewicz.

Sin embargo, usar WebMvcConfigurationSupport en lugar de WebMvcConfigurerAdapter es más apropiado para personalizaciones avanzadas. Ese era el caso si también necesitaba agregar los conversores predeterminados.

Consulte la documentación de Primavera Customizing the Provided Configuration

+0

Respuesta más completa que la respuesta aceptada. –

+2

¿Por qué el método 'convertidor()' tiene que marcarse con '@ Bean'? –

+1

JavaDoc: al agregar conversores a la lista, se desactiva el registro del convertidor predeterminado. Para agregar simplemente un convertidor sin afectar el registro predeterminado, considere usar el método extendMessageConverters (java.util.List) en su lugar. – xedo

Cuestiones relacionadas