Я работаю с Spring Boot и попытаюсь объяснить ситуацию, в которой возникает мое сомнение.
Представьте, что MyObject
имеет некоторые другие объекты, составляющие его.
public class MyObject {
private Integer id;
private MyObject2 obj2;
private MyObject3 obj3;
private MyObject4 obj4;
// getters and setters ...
}
В некоторых из этих полей есть MyObject
, составляющие их.
Скажем, MyObject2
имеет MyObject
в качестве поля, выполняющего своего рода связь между обеими сторонами.(например: 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;
}
Это должна быть работа для уровня Service, или это должна быть работа для уровня Controller?
Я делаю это на уровне Controller, так как контроллер отвечает за возвратответ клиенту и сервисному уровню должен делать толькобизнес-правила и должны быть многоразовыми.
Я делаю это неправильно?