gpt4 book ai didi

java - 准备响应主体的逻辑应该在@Service还是@Controller上?

转载 作者:行者123 更新时间:2023-12-02 10:52:44 24 4
gpt4 key购买 nike

我正在使用 Spring Boot,并将尝试解释出现我疑问的情况。

想象一下 MyObject 有一些其他对象组成它。

public class MyObject {

private Integer id;
private MyObject2 obj2;
private MyObject3 obj3;
private MyObject4 obj4;

// getters and setters ...

}

其中一些字段由 MyObject 组成。

假设 MyObject2MyObject 作为字段,在双方之间建立某种关系。 (例如:ManyToOne)

public class MyObject2 {

// other fields
private List<MyObject> objs;

// getters and setters

}

由于我正在使用 REST API,并且需要将此实体返回到 Json 中,因此序列化时可能会发生无限递归,因为一个实体引用另一个实体。

当我解决创建 DTO 和帮助程序类的递归问题时,我对调用 DTO 和帮助程序类的逻辑应该放在哪里有疑问。

Helper.java

public static MyObject buildPrettyMyObject(MyObject obj) {
obj.setObj2(null);

return obj;
}

防止无限递归的逻辑是通过设置为 null<,从 MyObject2 中删除 MyObject2 引用上的所有 MyObject2 引用。/.

我的 Helper 类完成了这项工作,但是,我应该在哪里调用它?

在我的 Controller 中:

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层的工作?

我在 Controller 层执行此操作,因为 Controller 负责将响应返回给客户端,而服务层应该只执行业务规则并且必须可重用。

我这样做错了吗?

最佳答案

I'm doing this at the Controller layer, since the controller is responsible for return the response to the client and the Service layer should only do business rules and has to be reusable. Am I doing this wrong?

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

关于java - 准备响应主体的逻辑应该在@Service还是@Controller上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52031999/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com