有条件地忽略特定属性DTO

时间:2017-04-17 21:19:00

标签: java json rest api swagger

我有一个特定的要求,我有一个像EmployeeDTO.java这样的POJO

以下字段;

int employeeId;
String Name;
double salary;
String createdBy;
Date createdTimestamp;
String updatedBy;
Date updatedTimestamp; 

现在我的要求是,我将获得一个创建API请求作为JOSN我不应该得到任何字段,如employeeId,createdBy,createdTimestamp,updatedBy,updatedTimestamp。

但是在GET API响应中,我应该发送所有这些字段。

我不能在这里使用jsonIgnore作为employeeId之类的字段我没有在请求中表示它,但我想在响应中发送它。

在PATCH / PUT api调用中,我希望来自请求中的UI的employeeId,但不要低于4个字段createdBy,createdTimestamp,updatedBy,updatedTimestamp。

所以一个简单的解决方案就是我可以创建单独的DTO,例如EmployeeDTO,EmployeeCreateRequestDTO,EmployeeUpdateRequestDTO。但这会导致代码重复。

有没有更好的方法或json功能/注释可用于实现此目的?

我想要这个的原因,在Swagger Model Schema中它显示了EmplyeeDTO中可用的所有字段,我想在这里特定于创建请求用户不应该看到任何后面设置的字段结束像id,createdBy等。

1 个答案:

答案 0 :(得分:1)

使用明确表示业务用例的数据/行为的特定类比混合不应该的东西更好(在可读性,可维护性方面)。

  

所以一个简单的解决方案就是我可以创建单独的DTO,比如   EmployeeDTO,EmployeeCreateRequestDTO,EmployeeUpdateRequestDTO。但   它会导致代码重复。

如果EmployeeCreateRequestDTOEmployeeUpdateRequestDTO的所有常用字段仅出现在EmployeeDTO中,则不会创建必要的代码重复。

为避免重复,您有两种方法。

1)继承性
EmployeeCreateRequestDTOEmployeeUpdateRequestDTOEmployeeDTO的子类 优点:子类可以直接访问EmployeeDTO

的公共公共getter / setter

2)组成
这些特定类中的每一个都包装一个EmployeeDTO实例并定义它们自己的字段 优点:子类可以更灵活地定义哪些应该可以从EmployeeDTO字段访问。