2017-10-06 78 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好的,没问题 –