【问题标题】:Jersey: different JSON filter for one DTOJersey:一个 DTO 的不同 JSON 过滤器
【发布时间】:2017-10-06 07:46:30
【问题描述】:

我正在使用 Jersey(JaxRS 和 Jackson)。

我有一个学生 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 类来做到这一点?

【问题讨论】:

  • 您可以尝试使用所需的参数重载构造函数..
  • 重载构造函数不能用于过滤请求参数。 Jackson 将映射到类成员,即使它们是私有的,而不是 getter/setter/constructor。
  • 我个人认为3个DTO在语义上比较好。它提供了 API 的正确文档,而不必记住在每种情况下应该存在或不应该存在哪些字段。我的两分钱;)另外,如果您可以使它们不可变...

标签: java jackson jersey jax-rs n-tier-architecture


【解决方案1】:

尝试为每种情况创建自定义序列化程序。
通过扩展 StdSerializer<T> 创建自定义序列化程序并覆盖 serialize(T value, JsonGenerator gen, SerializerProvider provider) 方法并将其注册到 ObjectMapper

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


还有一个问题。如果你创建一个对象,除了name、className和grade之外的字段是空的吗?您可以尝试在班级级别使用注释@JsonInclude(Include.NON_NULL)

【讨论】:

  • 请通过包含相关代码片段来改进答案。链接往往会过时。
  • @M.leRutte 好的,没问题
猜你喜欢
  • 1970-01-01
  • 2013-10-29
  • 2016-10-23
  • 2012-06-06
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2017-11-08
相关资源
最近更新 更多