我使用Spring MVC 3.0.5和Jackson 1.7.2。我希望实现一个动态Bean序列化器分配机制,例如,假设我的MVC控制器返回(@ResponseBody
)一个MyObject类型的对象。默认情况下,Jackson的SerializerFactory会查找最合适的序列化器,包括我的自定义序列化器(例如CustomSerializer extends JsonSerializer<MyObject>
)。Spring MVC + Jackson:Dynamic Json序列化
但是,我希望我的自定义串行器被触发,以防万一某个标志处于活动状态(假设连接到ThreadLocal的布尔变量)。否则,我想用Jackson提供的串行器,保持MappingJacksonHttpMessageConverter
的默认行为不变。
有什么方法可以实现这个方法吗?
我已经将自己的ObjectMapper,SerializerFactory和CustomSerializers注册到Spring的<mvc:annotaion-driven />
默认MappingJacksonHttpMessageConverter
。
public class ConvertingPostProcessor implements BeanPostProcessor {
private ObjectMapper jacksonJsonObjectMapper;
public Object postProcessBeforeInitialization(Object bean, String name)
throws BeansException {
if (bean instanceof AnnotationMethodHandlerAdapter) {
HttpMessageConverter<?>[] convs = ((AnnotationMethodHandlerAdapter) bean).getMessageConverters();
for (HttpMessageConverter<?> conv: convs) {
if (conv instanceof MappingJacksonHttpMessageConverter) {
((MappingJacksonHttpMessageConverter) conv).setObjectMapper(jacksonJsonObjectMapper);
}
}
}
return bean;
}
public Object postProcessAfterInitialization(Object bean, String name)
throws BeansException {
return bean;
}
public void setJacksonJsonObjectMapper(ObjectMapper jacksonJsonObjectMapper) {
this.jacksonJsonObjectMapper = jacksonJsonObjectMapper;
}
}
和Spring mvc.xml是:提前
<mvc:annotation-driven />
...
<bean id="jacksonJsonObjectMapper" class="org.mycode.serialize.CustomObjectMapper">
<property name="customSerializerFactory" ref="jacksonJsonCustomSerializerFactory" />
</bean>
<bean id="jacksonJsonCustomSerializerFactory" class="org.mycode.serialize.CustomSerializerFactoryRegistry">
<property name="serializers">
<map>
<entry key="org.mycode.domain.MyObject" value-ref="customSerializer" />
</map>
</property>
</bean>
<bean id="customSerializer" class="org.mycode.serialize.CustomSerializer">
<property name="jacksonJsonCustomSerializerFactory" ref="jacksonJsonCustomSerializerFactory" />
</bean>
<bean id="convertingPostProcessor" class="org.mycode.serialize.ConvertingPostProcessor">
<property name="jacksonJsonObjectMapper" ref="jacksonJsonObjectMapper" />
</bean>
谢谢!
对不起,不是答案,而是一个问题:你是如何将自定义对象映射器设置为默认的annotationmethodhandlermapping ...你确定使用自定义对象映射器吗?你是如何找出使用哪个bean ID的? – 2011-03-10 13:41:05