2017-10-06 60 views
0

我正在使用Jersey(JaxRS和Jackson)。Jersey:針對一個DTO的不同JSON過濾器

我有一個學生DTO。

class StudentDTO { 
    private Integer id; 
    private String name, className, grade; 
    private String createdAt, modifiedAt; 

    // getter, setter for all private members above 

我想讓DTO在創建,讀取和更新中重複使用。

但是,對於創建,只允許name,className和grade。對於更新,只允許className和grade。

我目前的解決方案是使用三個不同的DTO類,一個用於創建,一個用於更新,另一個用於讀取。

如何做到這一點只有一個DTO類?

+0

您可以嘗試使用所需的參數重載構造函數.. – Coder

+0

重載構造函數不能用於過濾請求參數。傑克遜將映射到類成員,即使他們是私人的,而不是getter/setter/constructor。 – Kuzunoha

+0

我個人認爲3個DTO在語義上更好。它給出了適當的API文檔,而不必記住每個情況下哪些字段應該存在或不存在。我的兩美分;)也如果你可以讓他們不可變... –

回答

0

嘗試爲每個案例創建自定義序列化器。
通過擴展StdSerializer<T>創建自定義序列化和重寫serialize(T value, JsonGenerator gen, SerializerProvider provider)方法和ObjectMapper
registrate它

ObjectMapper mapper = new ObjectMapper(); 
SimpleModule module = new SimpleModule(); 
module.addSerializer(StudentDTO.class, new CustomSerializer()); 
mapper.registerModule(module); 


一個問題。如果你創建了一個對象,除了name,className和grade之外的字段是空的? YOW可以在課堂上嘗試使用註釋@JsonInclude(Include.NON_NULL)

+0

請通過包括一個相關的代碼snippit來改善答案。鏈接往往過時。 –

+0

@ M.leRutte好的,沒問題 –