2011-02-16 113 views
4

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

谢谢!

+0

对不起,不是答案,而是一个问题:你是如何将自定义对象映射器设置为默认的annotationmethodhandlermapping ...你确定使用自定义对象映射器吗?你是如何找出使用哪个bean ID的? – 2011-03-10 13:41:05

回答

2

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