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

Dan*_*lor 30 java spring annotations spring-mvc jackson

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

我使用配置REST通道

<mvc:annotation-driven />
Run Code Online (Sandbox Code Playgroud)

现在我只想配置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>
Run Code Online (Sandbox Code Playgroud)

Bean已创建,但转换器的另一个实例已创建并在通道中使用.所以我已经尝试过这个Stackoverflow问题@Configuration@Bean在其中描述,但json序列化仍然使用自己的配置.

最后我试图通过注入mapper

@Autowired
private MappingJacksonHttpMessageConverter jacksonConverter;
Run Code Online (Sandbox Code Playgroud)

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

Tom*_*icz 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

调用addDefaultHttpMessageConverters()是必需的,因为使用自定义转换器时不会应用默认值.

重要说明@EnableWebMvc如果扩展WebMvcConfigurationSupport,则 必须删除要配置的转换器.

  • "重要提示"救了我!谢谢! (4认同)
  • 仍然,在我的情况下,只创建了MappingJacksonHttpMessageConverter的另一个实例,它不是之后使用的实例 (2认同)
  • 由于某些未知原因,这对我不起作用。可能是因为我有扩展`WebMvcConfigurationSupport`的类和其他扩展`WebMvcConfigurerAdapter`的类吗?在两种情况下都显示了应用启动时的调试,代码由Spring执行。但是在调用控制器时仍然不是我的配置的对象映射器。 (2认同)

Jos*_*ias 27

仅在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() {
        // [...]
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这很像Tomasz Nurkiewicz的答案所提供的示例.

但是,使用WebMvcConfigurationSupport而不是WebMvcConfigurerAdapter更适合高级自定义.如果您还需要添加默认转换器,则会出现这种情况.

请参阅Spring文档自定义提供的配置

  • 为什么方法`converter()`必须用`@ Bean`标记? (2认同)
  • @MikhailBatcer - 放置`@ Bean`注释,以便您可以在容器(spring)上下文中使用此方法返回的对象.另请参阅答案语境化的问题. (2认同)