Spring MVC + Jackson: 动态Json序列化

5
我正在使用Spring MVC 3.0.5和Jackson 1.7.2。我希望实现一个动态Bean序列化器分配机制,例如,假设我的MVC控制器返回(@ResponseBody)类型为MyObject的对象。默认情况下,Jackson的SerializerFactory会查找最合适的序列化器,包括我的自定义序列化器(例如CustomSerializer extends JsonSerializer<MyObject>)。
然而,我想让我的自定义序列化器仅在某些标志处于活动状态时触发(例如,附加到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> 

Thanks in advance!!


抱歉,并非答案,而是一个问题:您是如何将自定义对象映射器设置为默认的注解方法处理程序映射中的呢?您确定自定义对象映射器被使用了吗?您又是如何确定要使用哪个bean ID的? - Sven Haiges
好奇问一下 - 你为什么想要做一个自定义的 Marshaller?@Sven - 打开大量的 Spring 调试日志,你可以看到很多东西。不过,很多涉及其中的类并没有任何日志记录。所以你需要通过调试 Spring 源代码来查看发生了什么。 - drekka
1个回答

2

Jackson库现在还不够成熟。因此,渲染模型对象存在问题。它提供了一些注释和过滤器以自定义渲染的JSON,但是不够。所以我建议您创建新的Java类仅用于视图,并使用Dozer框架将域对象映射到此视图类,并在responsebody中返回此视图类。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接