为了账号安全,请及时绑定邮箱和手机立即绑定

准备响应正文的逻辑应该在@Service 上还是在@Controller 上?

准备响应正文的逻辑应该在@Service 上还是在@Controller 上?

撒科打诨 2021-08-13 16:25:51
我正在使用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 和辅助类的逻辑应该去哪里有疑问。帮助程序public static MyObject buildPrettyMyObject(MyObject obj) {    obj.setObj2(null);    return obj;}用于防止无限循环的逻辑是在去除所有MyObject2上的引用MyObject从参考MyObject2通过设定null。我的助手类完成了这项工作,但是,我应该在哪里调用它?在我的控制器中: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层的工作?我在控制器层这样做,因为控制器负责将响应返回给客户端,而服务层应该只执行业务规则并且必须是可重用的。我这样做错了吗?
查看完整描述

1 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

我在控制器层这样做,因为控制器负责将响应返回给客户端,而服务层应该只执行业务规则并且必须是可重用的。我这样做错了吗?

你做得对。这是一个表示/序列化问题,因此理想的候选者是控制器层。但这是Bikeshedding问题之一,您可以花几天甚至几周的时间来讨论它。你做得对,继续前进。


查看完整回答
反对 回复 2021-08-13
  • 1 回答
  • 0 关注
  • 337 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信