当前位置: 首页 > 知识库问答 >
问题:

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

孔磊
2023-03-14

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

我需要在springboot中为客户实体字段的不同组合实现不同的api,只返回在用户查询过的对象中设置的字段,并从对象中删除空值字段。一种方法是为客户实体列的不同组合实现不同的dto。有没有其他方法可以实现同样的功能,我不需要在Spring boot中为Customer entity列的不同组合定义不同的dto???

共有3个答案

丁阎宝
2023-03-14

这可以在DTO类中使用@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;
}  
施赞
2023-03-14

使用Jackson 2.0序列化,您可以在不同级别的非null上指定数据包含,即在对象映射器(带构造函数选项)、DTO类或DTO类字段(带注释)上。请参见此处的Jackson注释

席乐童
2023-03-14

您可以直接配置ObjectMapper,或使用@JsonInclude注释:

mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

@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);

由于密码为空,因此您将拥有一个不存在密码的对象。

{
  "id": 1,
  "name": "Vikas",
  "email": "info@vikas.com"
}
 类似资料:
  • 问题内容: 我有2张桌子- : 第二张桌子- : 我只需要选择未取消的预订(在此示例中仅为ID 3)。我可以轻松地选择带有简单条件的已取消,但由于未在此处取消工作,因此我在努力避免未取消。 问题答案: 要么: 第一个版本更直观,但是我认为第二个版本通常可以获得更好的性能(假设您在联接中使用的列上有索引)。 第二个版本有效,因为返回第一个表中所有行的一行。当条件成功,这些行会包括从第二表中的列,就像

  • 为下面的代码生成的字节代码在类中创建一个字段。当为可变字段赋值时,原始委托不会更改。 有没有一种方法可以在运行时更改委托,同时保持实现? 该示例取自https://kotlinlang.org/docs/reference/delegation.html文档并经过编辑。

  • 我有一个方法,它接受一个内部有的对象: MatchData k可以是null,有时k.getWatchListDetail()也可以是null。 我需要检查两种情况。首先,如果它能抛出NPE。 上面的实现可以做到这一点,但我尝试使用或带有链接的流,所以我可以在一行链接中完成。

  • 问题内容: 在浏览一些旧代码时,我遇到了这个宝石: 第二行在Eclipse中被标记为无效代码,我知道为什么。似乎没有明确抛出任何异常,并且构造函数不可能抛出任何类型的异常(例如)。 我的问题是 为什么 要进行空检查?以前在Java的旧版本中,构造函数是否可以返回null?还是这仅仅是毫无用处的代码? 问题答案: 该代码在任何Java版本中均无效。构造函数不可能返回,即使构造函数会抛出异常,也不会调

  • 问题内容: 在运行该行之后,在指令指针返回到调用函数之前,是否可以看到方法的返回值? 我正在调试无法修改的代码 (阅读:不想重新编译第三方库) ,有时它会跳转到我没有源代码的代码,或者return表达式具有使我无法继续工作的副作用只需在“ 显示” 标签中运行表达式即可。 通常在复合语句中使用返回值,因此 Variables 视图将永远不会向我显示该值(因此希望在控件返回到调用函数之前先查看结果)。

  • 问题内容: 我有一个简单的Java类,如下所示: 这段代码的输出是这样的: 为什么s不在finally块中覆盖,而是控制打印输出? 问题答案: 在与所述的执行块完成语句和的值在时间语句执行是由该方法返回的值。finally子句稍后s(在语句完成之后)更改值的事实(此时)并未更改返回值。 请注意,以上内容处理的s是对块中自身值的更改,而不是对s引用对象的更改。如果s是对可变对象的引用(String不