Я использую Spring MVC 3.0.5 с Jackson 1.7.2.
Я хочу реализовать механизм назначения сериализатора Dynamic Bean, например, допустим, что мой контроллер MVC возвращает (@ResponseBody
)Объект типа MyObject.По умолчанию SerializerFactory Джексона будет искать наиболее подходящий Serializer, включая мои пользовательские Serializer (например, CustomSerializer extends JsonSerializer<MyObject>
).
Однако я хочу, чтобы мои пользовательские Serializer запускались только в случае, если какой-либо флаг активен (скажем, логическая переменная, прикрепленная к ThreadLocal).В противном случае я хочу использовать предоставленные Джексоном сериализаторы, сохраняя поведение по умолчанию MappingJacksonHttpMessageConverter
без изменений.
Есть ли способ реализовать такой подход?
Я уже зарегистрировал свой собственныйObjectMapper, SerializerFactory и CustomSerializer в Spring <mvc:annotaion-driven />
default 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>
Заранее спасибо !!