我想替换MappingJacksonHttpMessageConverter的默认objectMapper。
我找到了一个有效的解决方案,但我对它并不满意:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-2.0.xsd">
<!-- Scans the classpath of this application for @Components to deploy as beans -->
<context:component-scan base-package="org.mypackage.service"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="messageConverters">
<list>
<!--Adding the default message converters-->
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="writeAcceptCharset" value="false"/>
</bean>
<bean class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
<bean class="org.springframework.http.converter.xml.XmlAwareFormHttpMessageConverter"/>
<!--Adding our custom JSON converter-->
<bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper">
<util:constant static-field="org.mypackage.JsonUtils.MAPPER"/>
</property>
</bean>
</list>
</property>
</bean>
该解决方案使用我的自定义消息转换器列表初始化RequestMappingHandlerAdapter类。
我不喜欢这个解决方案,因为我需要添加默认的消息转换器(我从org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
构造函数中复制)。
如果不添加默认转换器 - 我的控制器只能处理应用程序/ json请求,并忘记了如何处理其他基本请求,例如application / xml。
感谢。
答案 0 :(得分:4)
您可以通过代码完成此操作,而无需声明RequestMappingHandlerAdapter
bean并手动初始化所有这些转换器。您应该写一个BeanPostProcessor
,如下所示:
public class MyBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof AnnotationMethodHandlerAdapter) {
AnnotationMethodHandlerAdapter adapter = (AnnotationMethodHandlerAdapter) bean;
HttpMessageConverter<?>[] converters = adapter.getMessageConverters();
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof MappingJacksonHttpMessageConverter) {
initConverter((MappingJacksonHttpMessageConverter) converter);
}
}
} else if(bean instanceof MappingJacksonHttpMessageConverter){
initConverter((MappingJacksonHttpMessageConverter) bean);
}
return bean;
}
private void initConverter(MappingJacksonHttpMessageConverter converter) {
MappingJacksonHttpMessageConverter jsonConverter = (MappingJacksonHttpMessageConverter) converter;
final ObjectMapper mapper = // get your mapper from wherever
jsonConverter.setObjectMapper(mapper);
/* here you can apply any other configuration you wish*/
}
}
并将其定义为bean:
<bean class="my.package.MyBeanPostProcessor" id="myBeanPostProcessor" lazy-init="false"/>
通过这种方式,您可以准确地编辑您真正感兴趣的内容 - MappingJacksonHttpMessageConverter
。