Serialization Spring MVC+;Jackson:动态Json序列化

Serialization Spring MVC+;Jackson:动态Json序列化,serialization,dynamic,spring-mvc,jackson,Serialization,Dynamic,Spring Mvc,Jackson,我正在使用SpringMVC3.0.5和Jackson 1.7.2 我希望实现一个动态Bean序列化器分配机制,例如,假设我的MVC控制器返回(@ResponseBody)一个MyObject类型的对象。默认情况下,Jackson的SerializerFactory将查找最合适的序列化程序,包括我的自定义序列化程序(例如CustomSerializer扩展JsonSerializer) 但是,我希望触发自定义序列化程序,以防某个标志处于活动状态(例如,一个附加到ThreadLocal的布尔变量)

我正在使用SpringMVC3.0.5和Jackson 1.7.2

我希望实现一个动态Bean序列化器分配机制,例如,假设我的MVC控制器返回(
@ResponseBody
)一个MyObject类型的对象。默认情况下,Jackson的SerializerFactory将查找最合适的序列化程序,包括我的自定义序列化程序(例如
CustomSerializer扩展JsonSerializer

但是,我希望触发自定义序列化程序,以防某个标志处于活动状态(例如,一个附加到ThreadLocal的布尔变量)。否则,我希望使用Jackson提供的序列化程序,保持
映射JacksonHttpMessageConverter
的默认行为不变

有没有办法实现这一目标

我已经将自己的ObjectMapper、SerializerFactory和CustomSerializer注册到Spring的
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;
    }
}
公共类转换后处理器实现BeanPostProcessor{
私有对象映射器JacksonJSONObject映射器;
初始化之前的公共对象后处理(对象bean、字符串名称)
抛出BeansException{
if(AnnotationMethodHandlerAdapter的bean实例){
HttpMessageConverter[]convs=((AnnotationMethodHandlerAdapter)bean);
用于(HttpMessageConverter conv:convs){
if(映射JacksonHttpMessageConverter的conv实例){
((MappingJacksonHttpMessageConverter)conv).setObjectMapper(jacksonJsonObjectMapper);
}
}
}
返回豆;
}
公共对象后处理后初始化(对象bean,字符串名称)
抛出BeansException{
返回豆;
}
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> 

...

提前谢谢

Jackson库目前还不够成熟。因此呈现模型对象有问题。它提供了一些注释和过滤器来定制呈现的json,但还不够。因此,我建议您仅为视图创建新的java类,并使用framework end将域对象映射到此视图类,并在ResponseBy中返回此视图类。

,不是答案而是一个问题:如何将自定义对象映射器设置为默认的annotationmethodhandlermapping。。。是否确实使用了自定义对象映射器?您是如何确定要使用哪个bean id的?奇怪的是,您为什么要使用客户封送员@Sven-通过打开大量spring调试日志记录,您可以看到很多。但不幸的是,其中涉及的许多类都没有任何日志记录。因此,您必须通过spring源代码进行调试,以查看发生了什么。