【问题标题】:Spring MVC + Jackson: Dynamic Json serializationSpring MVC + Jackson:动态Json序列化
【发布时间】:2011-06-28 06:02:03
【问题描述】:

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

提前致谢!!

【问题讨论】:

  • 对不起,不是答案,而是一个问题:您如何将自定义对象映射器设置为默认的 annotationmethodhandlermapping...您确定使用自定义对象映射器吗?您是如何确定要使用哪个 bean id 的?
  • 出于好奇 - 为什么要做客户编组员? @Sven - 你可以通过打开大量的 spring 调试日志来看到很多东西。不幸的是,其中涉及的许多类都没有任何日志记录。所以你必须通过spring源代码来调试看看是怎么回事。

标签: serialization dynamic spring-mvc jackson


【解决方案1】:

Jackson 库目前还不够成熟。所以渲染模型对象有问题。它提供了一些注释和过滤器来自定义渲染的 json,但还不够。所以我建议你为视图创建新的 java 类并将域对象映射到这个视图使用dozer框架的类在responsebody中返回这个视图类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 2012-08-20
    相关资源
    最近更新 更多