【问题标题】:Springboot: Ignore null values in response optionallySpring Boot:可选地忽略空值响应
【发布时间】:2021-04-23 04:43:51
【问题描述】:

有一个由多个 API 使用的模型类,如果此模型类中的字段为 null,则它在 JSON 响应中返回为 null。但是,另一个 API 正在使用相同的模型类,此处应在响应中省略空字段。

有没有办法在不创建模型文件的另一个副本的情况下实现这一点,只需使用@JsonInclude(Include.NON_NULL) 引入空字段

例子,

class A {
 private String b;
 private String c;
 private String d;
 // getters and setters
}

需要响应 1

"A": {
  "b": "val1",
  "c": null,
  "d": "val2"
}

需要响应 2(省略空值)

"A": {
  "b": "val1",
  "d": "val2"
}

有没有办法使用单个模型类来实现这些行为?实例化时的某种配置?

【问题讨论】:

  • 那么我猜你将不得不这样做:stackoverflow.com/a/35672470/14072498
  • 这看起来比创建这个类的副本和注释更多的代码:)
  • 是的,我知道,它不漂亮。是一个在讨论使用反射修改 DTO 的线程最后的人。试图找到更具体的东西。

标签: java json spring spring-boot


【解决方案1】:

在阅读了大量来自博客和 SO 的文档和代码之后,我想说的是,实现您想要的东西所需的额外代码行数量和复杂性并不能证明付出的努力是合理的。

通过下面的示例,您将获得一个额外的类,但它是最少的。如果要包含空字段,请使用 A 类,否则使用 B 类。

@Data
public class A {
   private String b;
   private String c;
   private String d;
}

@JsonInclude(JsonInclude.Include.NON_NULL)
public class B extends A { }

序列化这些类时,A 类的 JSON 可能如下所示

{
  "b": "val1",
  "c": null,
  "d": "val2"
}

B类也是这样

{
  "b": "val1",
  "d": "val2"
}

如果您还没有在您的项目中使用 Lombok,请将其添加到您的 POM 以使 @Data 工作:

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 2021-10-13
    • 1970-01-01
    • 2014-07-05
    • 2015-11-04
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2017-05-04
    相关资源
    最近更新 更多