2011-02-24 81 views
3

我在Spring 3 MVC應用程序中使用Jackson JSON。爲了不序列的每一個日期字段,我創建了一個自定義的objectmapper使用特定日期格式:Jackson序列化配置

@Component("jacksonObjectMapper") 
public class CustomObjectMapper extends ObjectMapper 
{ 
    Logger log = Logger.getLogger(CustomObjectMapper.class); 

    @PostConstruct 
    public void afterProps() 
    { 
     log.info("PostConstruct... RUNNING"); 
     //ISO 8601 
     getSerializationConfig().setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SZ")); 


    } 

    //constructors... 

} 

這種習俗ObjectMapper注入JsonConverter:

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
    <property name="supportedMediaTypes" value="application/json" /> 
    <property name="objectMapper" ref="jacksonObjectMapper" /> <!-- defined in CustomObjectMapper --> 
</bean> 

沒有例外的日誌和序列化工作,但它沒有選擇日期格式,它簡單地序列化爲時間戳。 @PostConstruct註釋起作用,方法中的日誌語句在日誌中。

有誰知道爲什麼這會失敗?

+0

此問題是否解決? – 2011-06-15 17:05:39

+0

@Sven Haiged我並不指出json是支持的媒體類型,但hwen我調試它json包含在支持的媒體類型中,並且運行良好。我錯過了什麼嗎? – kamaci 2011-11-16 06:18:49

回答

3

您可能還需要指定,做你想要的文本日期序列:

configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false); 

(雖然我是假設設置非空的日期格式也可能觸發它,但也許不是)

此外,您可以直接從構造函數(這是安全的)進行配置映射器。並不是說它會改變行爲,但會消除單獨配置方法的需要。

+0

對不起,這似乎沒有幫助。很奇怪。我仍然可以將日期打印出來作爲時間戳。 – 2011-03-10 13:25:50

+0

絕對有些奇怪的是那麼;聽起來好像也許你沒有配置正在使用的ObjectMapper,或者Jackson沒有被用於序列化。 – StaxMan 2011-03-10 18:22:39

0

我已經完成了下面的工作來解決與Java/PHP時間戳的兼容性問題。 Java使用毫秒,因爲EPOCH和PHP使用秒數,所以使用ISO日期更簡單。

我宣佈了下述消息適配器:

<bean id="messageAdapter" 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <bean id="jacksonJsonMessageConvertor" 
       class="my.app.MyMappingJacksonHttpMessageConverter"/>     
     </list> 
    </property> 
</bean> 

而且MyMappingJacksonHttpMessageConverter看起來像下面:

public class MyMappingJacksonHttpMessageConverter extends MappingJacksonHttpMessageConverter { 

public MyMappingJacksonHttpMessageConverter(){ 
    super(); 
    ObjectMapper objectMapper = new ObjectMapper(); 
    objectMapper.configure(Feature.WRITE_DATES_AS_TIMESTAMPS, false); 
    setObjectMapper(objectMapper); 
} 
} 

隨着上述所有日期以ISO格式寫出。