Springboot:可以在运行时更改 DTO,空值不存在于从 api 返回的对象中吗?

Springboot: Can DTO be changed at runtime with null values not being present in the object returned from api?

我有一个 springboot 应用程序正在访问数据源的原始 api。现在假设我有一个包含大约 50 个字段的 Customer 实体,并且我有一个原始 api 用于它,我在其中传递列的名称并获取该列的值。现在我在使用原始 api.

的 springboot 中实现 api

我需要在 springboot 中针对客户实体字段的不同组合实施不同的 api,并且 return 仅针对用户查询的对象中设置的那些字段并删除空值来自对象的字段。一种方法是为 Customer 实体的列的不同组合实施不同的 dto。有没有其他方法可以实现相同的方法,我不需要为 Spring 引导中 Customer 实体的列的不同组合定义不同的 dto???

使用 Jackson 2.0 序列化,您可以指定不同级别的非空数据包含,即在对象映射器(使用构造函数选项)、DTO class 或 DTO class 字段(使用注释) ). See Jackson annotations here

你可以直接配置ObjectMapper,或者使用@JsonInclude注解:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

OR

@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class Customer {

    private Long id;
    private String name;
    private String email;
    private String password;

    public Customer() {
    }

    // getter/setter ..
}

您可以使用示例代码了解如何操作:

Customer customer = new Customer();
customer.setId(1L);
customer.setName("Vikas");
customer.setEmail("info@vikas.com");

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
String valueAsString = objectMapper.writeValueAsString(customer);

由于留下了密码null,您将拥有一个不存在密码的对象

{
  "id": 1,
  "name": "Vikas",
  "email": "info@vikas.com"
}

这可以在 DTO class 中使用 @JsonInclude 来完成。请参考以下代码块以忽略空值。

@JsonInclude(Include.NON_NULL) // ignoring null values 
@Data //lombock
@Builder //builder pattern 
public class Customer {

    private Long id;
    private String name;
    private String email;
    private String password;
}