2011-02-16 45 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框架結束視圖類返回此視圖類在響應者中。