java - 有条件地忽略特定属性 DTO

标签 java json rest api swagger

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

具有以下字段;

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

现在我的要求是,当我收到一个 Create 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 模型架构中,它显示了 EmplyeeDTO 中可用的所有字段,我想在此处具体说明创建请求,用户不应该看到后面设置的任何字段结束如 id、createdBy 等

最佳答案

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

So a simple solutions can be I can create separate DTOs, like EmployeeDTO, EmployeeCreateRequestDTO, EmployeeUpdateRequestDTO. But it will leads to duplication of codes.

如果 EmployeeCreateRequestDTOEmployeeUpdateRequestDTO 的所有公共(public)字段仅存在于 EmployeeDTO 中,则不一定会造成代码重复。

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

1) 继承
EmployeeCreateRequestDTOEmployeeUpdateRequestDTOEmployeeDTO 的子类。
优点:子类可以直接访问 EmployeeDTO 父类的公共(public)公共(public) getter/setter

2) 构图
这些特定类中的每一个都包装一个 EmployeeDTO 实例并定义自己的字段。
优点:子类可以更灵活地定义哪些内容可以从 EmployeeDTO 字段访问。

关于java - 有条件地忽略特定属性 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43459798/

相关文章:

java - 如何正确地从 RESTful API 传递错误?

java - 如何在 servlet 和套接字之间建立连接

java - 如何以编程方式将映射资源添加到 hibernate 配置以创建 session 工厂?

ios - 无法解析数据 JSON alamofire SwiftyJSON

javascript - webpack-dev-server 和 webpack -> 输出文件到父目录并且 webpack-dev-server 热重载仍然工作

rest - 通过REST API实现服务器端对长时间轮询的响应

java - 在 jax-rs Resteasy 拦截器中检索客户端 IP 地址

java - 对于下面的代码行,我得到 "Boxed value is unboxed and then immediately reboxed"findbug.. 如何解决这个问题?

java - SwingWorker线程即使任务完成也没有关闭?

javascript - 如何在 Javascript 对象中引用 JSON 集作为键