Логика для подготовки тела ответа должна быть на @Service или на @Controller? - PullRequest
0 голосов
/ 27 августа 2018

Я работаю с 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, так как контроллер отвечает за возвратответ клиенту и сервисному уровню должен делать толькобизнес-правила и должны быть многоразовыми.

Я делаю это неправильно?

1 Ответ

0 голосов
/ 27 августа 2018

Я делаю это на уровне контроллера, поскольку контроллер отвечает за возврат ответа клиенту, а уровень обслуживания должен выполнять только бизнес-правила и должен использоваться повторно.Я делаю это неправильно?

Вы делаете это правильно.Это проблема представления / сериализации, поэтому идеальным кандидатом для этого является уровень контроллера.Но это одна из тех проблем Bikeshedding , на которые вы можете потратить дни или даже недели, обсуждая ее.Вы делаете это правильно, просто двигайтесь дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...