2013-02-07 31 views
0

我使用Jersey 1.16來提供給我的客戶端應用程序的寧靜服務。遷移到澤西島時使用Jackson的向後兼容性問題

我試圖從默認的澤西JSON序列使用傑克遜基於這個優秀的博客條目移動:

http://crazytechbuddy.blogspot.co.il/2012/06/making-jersey-to-use-jackson-instead-of.html?showComment=1360271858862#c6459334450173933715

這偉大的工作,似乎做的正是我想要的。但是它現在爲我的寧靜服務創建了向後兼容性問題。

例如:我曾經被序列化爲"timestamp":"2012-12-25T14:22:24+02:00"的時間戳字段現在被序列化爲"timestamp":1356438144000

是否有一種方法可以選擇僅在特定請求上激活基於jackson的新序列化模式(可能使用版本參數,我必須決定使用哪種類型的序列化)?

回答

0

傑克遜有很多序列化選項。你的情況,你需要設置:

private ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false); 

,如果你使用的是傑克遜的1.x或

private ObjectMapper mapper = new ObjectMapper(); 
mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); 

如果你使用2.x版本傑克遜

爲了讓澤西ObjectMapper你需要創建一個提供訪問自定義:

@Provider 
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> 
{ 
    private final transient ObjectMapper mapper; 

    @Inject 
    public ObjectMapperProvider() 
    { 
    this.mapper = MyMapper.getMapper(); 
    } 

    @Override 
    public ObjectMapper getContext(final Class<?> type) 
    { 
    return this.mapper; 
    } 
} 

哪裏MyMapper.getMapper()返回您的自定義ObjectMapper

+0

當我明確使用映射器時,這看起來很合適 - 對嗎? 但是如果它剛被澤西島使用呢? – epeleg

+0

增加了關於如何訪問客戶ObjectMapper的信息。 – jgm

+0

謝謝。 我想這應該是在com.sun.jersey.config.property.packages初始參數爲球衣引用的包中。 我沒有測試過這個,因爲我已經爲使用@JSONSerialize的當前需求設置了一個解決方案。但它看起來像一個正確和完整的答案。 – epeleg