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

时间:2018-08-27 02:56:14

标签: java rest spring-boot

我正在使用 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;
}

防止无限递归的逻辑是通过将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;
}

这应该是服务层的工作,还是应该是控制器层的工作?

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

我做错了吗?

1 个答案:

答案 0 :(得分:1)

  

我正在控制器层执行此操作,因为控制器是   负责将响应返回给客户和服务   层应该只执行业务规则,并且必须可重用。我在做什么   这个错吗?

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