我使用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