DTO中的java动态字段类型
我正在使用Spring-MVC
,我有一个如下结构的DTO,从客户机(一个foo
实体)接收JSON
数据,并将其保存到带有JPA
的数据库中:
public class FooDTO {
public Integer id;
public String label;
public Double amount;
public List<Integer> states;
...
但是,当客户机想要编辑foo
实体时,我必须按照下面的方式构造它
public class FooDTO {
public Integer id;
public String label;
public Double amount;
public List<SimpleDto> states;
...
与SimpleDto
public class SimpleDto {
public Integer value;
public String label;
}
区别在于states
类型有时是List<SimpleDto>
有时是List<Integer>
,我不想创建另一个dto
那么,如何在dto(json)中实现动态字段类型呢
p.S JSON数据由com.fasterxml.jackson.core
处理
# 1 楼答案
为DTO类型使用弹簧类型转换器。这样,客户端可以发布stateId,转换器将解析给定ID的正确DTO类型
下面是一个例子:https://www.baeldung.com/spring-type-conversions
# 2 楼答案
我建议您使用不同的类:FooInfoDTO、foodailsdto。它通常在您拥有主详细信息表单时使用。在master(表)中,显示有关对象的简短信息(一个DTO),然后导航到详细信息,获取完整的对象数据(另一个DTO)
# 3 楼答案
使用自定义反序列化程序是解决问题的一种方法
发送和打印请求的控制器
存在泛型映射的pojo类
对象列表的输入有效负载
整数列表的输入有效负载
# 4 楼答案
您可以使用JsonCreator注释和两个构造函数来表示项
POJO
。如果数组中有一个基元1-arg
将使用构造函数。在完全设置对象的情况下2-arg
将使用构造函数。请参见以下示例:以上代码打印:
使用的版本:2.9.8
# 5 楼答案
我建议不要添加另一个促进重复的DTO。 但是,您仍然需要添加另一个DTO,该DTO将专用于您各自的服务。您只需使用层次结构定义DTO
定义您的响应DTO以提供详细信息,方法是将通用详细信息DTO扩展为FooDTO,如下所示:
对于“编辑”,定义DTO如下:
# 6 楼答案
写dto
在服务类中键入DTO并处理异常