如何在使用基于spring注释的配置时配置MappingJacksonHttpMessageConverter?

时间:2012-05-18 09:37:52

标签: java spring spring-mvc annotations jackson

我通过注释而不是纯xml bean来配置spring bean是不合理的,现在我正面临着后果。

我使用

配置REST频道
<mvc:annotation-driven />

现在我只想配置MappingJacksonHttpMessageConverter只输出具有非空值的字段的JSON。我尝试了以下内容:

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

创建bean,但在通道中创建并使用另一个转换器实例。所以我尝试使用this Stackoverflow question中描述的@Configuration@Bean,但json序列化仍然使用自己的配置。

最后我试图通过

注入映射器
@Autowired
private MappingJacksonHttpMessageConverter jacksonConverter;

但我以NoSuchBeanDefinitionException结束了。所以现在我没有选择,所以我在这里要求任何想法。如何控制和配置框架使用的映射器?

3 个答案:

答案 0 :(得分:59)

使用WebMvcConfigurer.configureMessageConverters()方法:

  

配置HttpMessageConverters使用[...]如果没有消息转换器添加到列表中,则会添加默认转换器。

使用@Configuration

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

需要调用addDefaultHttpMessageConverters(),因为使用自定义转换器时不会应用默认值。

重要提示如果您扩展WebMvcConfigurationSupport,则必须删除要配置的转换器的@EnableWebMvc

答案 1 :(得分:26)

仅在java代码中定制spring mvc servlet配置可以通过多种方式完成。

最简单的似乎是使用@Configuration扩展您的WebMvcConfigurerAdapter带注释的课程:

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

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

请注意,这与 Tomasz Nurkiewicz 的回答提供的示例很相似。

但是,使用WebMvcConfigurationSupport代替WebMvcConfigurerAdapter更适合高级自定义。如果您还需要添加默认转换器,那就是这种情况。

请参阅Spring文档Customizing the Provided Configuration

答案 2 :(得分:0)

以下解决方案是针对Spring 4.3(非引导)的,其中必须通过向Jackson转换器添加模块来解决fetch=FetchType.LAZY。可以使用类似的技术以任何方式修改转换器,包括删除和重新创建。

@Configuration
@EnableWebMvc
public class MvcConfig extends WebMvcConfigurerAdapter {

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

    for (HttpMessageConverter<?> mc : converters){
         if (mc instanceof MappingJackson2HttpMessageConverter || mc instanceof MappingJackson2XmlHttpMessageConverter) {
            ((AbstractJackson2HttpMessageConverter) mc).getObjectMapper().registerModule(new Hibernate5Module());
        }
    }
    return;
 }

在这种情况下

  • WebMvcConfigurerAdapter中还有许多其他配置,我想避免使用其他配置类。
  • 使用extendMessageConverters可以访问自动配置的Jackson类,而不会丢失所有其他消息转换器的配置,这是configureMessageConverters要做的。
  • 使用registerModule,您可以简单地将所需的Hibernate5Module添加到现有的转换器中。
  • 该模块已添加到JSON和XML处理器中