我通过注释而不是纯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
结束了。所以现在我没有选择,所以我在这里要求任何想法。如何控制和配置框架使用的映射器?
答案 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
添加到现有的转换器中。