java - 准备响应主体的逻辑应该在@Service 上还是@Controller 上?
问题描述
我正在使用Spring Boot,并将尝试解释出现我怀疑的情况。
想象一下,它MyObject
有一些其他的对象组成。
public class MyObject {
private Integer id;
private MyObject2 obj2;
private MyObject3 obj3;
private MyObject4 obj4;
// getters and setters ...
}
其中一些领域,已经MyObject
组成了它们。
比方说MyObject2
,MyObject
作为一个领域,在双方之间建立某种关系。(例如:多对一)
public class MyObject2 {
// other fields
private List<MyObject> objs;
// getters and setters
}
由于我正在使用 REST API 并且需要将此实体返回到 Json 中,因此在序列化时可能会发生无限递归,因为一个实体引用另一个实体。
当我解决创建 DTO 和辅助类的递归问题时,我对调用 DTO 和辅助类的逻辑应该去哪里存有疑问。
助手.java
public static MyObject buildPrettyMyObject(MyObject obj) {
obj.setObj2(null);
return obj;
}
防止无限递归的逻辑是通过设置来删除MyObject2
引用上的所有MyObject
引用。MyObject2
null
我的 Helper 类完成了这项工作,但是,我应该在哪里调用它?
在我的控制器中:
public ResponseEntity<?> handleRequestOfRetrieveAllMyObject2() {
List<MyObject2> objs2 = obj2Service.findAll();
objs2.forEach(obj2 -> obj2.getObjs().forEach(obj -> Helper.buildPrettyMyObject(obj)));
return ResponseEntity.ok(objs2);
}
在我的服务中:
public List<MyObject2> findAll() {
List <MyObject2> objs2 = obj2Repository.findAll();
objs2.forEach(obj2 -> obj2.getObjs().forEach(obj -> Helper.buildPrettyMyObject(obj)));
return objs2;
}
应该是 Service 层的工作,还是 Controller 层的工作?
我在控制器层这样做,因为控制器负责将响应返回给客户端,而服务层应该只执行业务规则并且必须是可重用的。
我做错了吗?
解决方案
我在控制器层这样做,因为控制器负责将响应返回给客户端,而服务层应该只执行业务规则并且必须是可重用的。我做错了吗?
你做得对。这是一个表示/序列化问题,因此理想的候选者是控制器层。但这是您可以花费数天甚至数周时间讨论的自行车脱落问题之一。你做得对,继续前进。
推荐阅读
- curl - 获取 curl:(35)错误:1400410B:SSL 例程:CONNECT_CR_SRVR_HELLO:每次运行 brew 时版本号错误
- wordpress - 我的 wordpress 网站的 Feedburner 出现错误
- node.js - 将文档添加到mongodb时,带有nodejs的mongodb返回空错误
- c# - 如何在服务器端访问 ASPxGridView 的 TotalSummary
- oop - 将角色混合到 Raku 中的对象中时的 `does` 与 `but` 运算符
- javascript - 如何从父级到子级使用功能组件?
- python-3.x - 在kivy python中切换到另一个屏幕时如何更新标签文本
- r - R - 如何通过两个不同的组从数据集中删除异常值
- kotlin - 如何覆盖密封类字段?
- docker - 在 Docker 容器中运行的基于 .Net Core 的项目中存储临时数据的最佳方式