Spring MVC - Rest API, где лучшее место для объединения сущностей - PullRequest
1 голос
/ 18 марта 2019

Где лучшее место для настройки родительского объекта? Другими словами, где лучшее место для объединения сущностей?

В контроллере найти родительский объект и установить для потомка, а затем сохранить?

@RestController
public class SomeController{

    @Autowired
    private SomeService someService;

    @PostMapping("/parents/{parentEntityId}/childs")
    public ResponseEntity<Void> save(@PathVariable("parentEntityId") Long parentEntityId, @RequestBody ChildDto childDto) {
        Optional<ParentEntity> parentEntity = someService.findParentById(parentEntityId);
        if (parentEntity.isPresent()) {
            ChildEntity childEntity = childDtoMapper.fromDto(childDto);
            childEntity.setParent(parentEntity.get());
            someService.saveChild(childEntity);
            return ResponseEntity.created(...).build();
        }
        throw new EntityNotFoundException("Parent entity not found!");
    }
}

OR

В контроллере сопоставьте dto с сущностью, затем отправьте сущность и идентификатор родительской сущности в службу, затем найдите родительскую сущность по идентификатору и задайте для child и сохраните?

@RestController
public class SomeController {

    @Autowired
    private SomeService someService;

    @PostMapping("/parents/{parentEntityId}/childs")
    public ResponseEntity<Void> save(@PathVariable("parentEntityId") Long parentEntityId, @RequestBody ChildDto childDto) {
            ChildEntity childEntity = childDtoMapper.fromDto(childDto);
            someService.saveChild(parentEntityId, childEntity);
            return ResponseEntity.created(...).build();
    }
}

public class SomeServiceImpl {

    @Autowired
    private ParentEntityRepository parentEntityRepository;

    @Autowired
    private ChildEntityRepository childEntityRepository;

    public ChildEntity saveChild(final long parentEntityId, final ChildEntity childEntity){
        Optional<ParentEntity> parentEntity = parentEntityRepository.findById(parentEntityId);
        if (parentEntity.isPresent()) {
            childEntity.setParent(parentEntity.get());
            childEntityRepository.save(childEntity);
            return childEntity;
        }
        throw new EntityNotFoundException("Parent entity not found!");
    }
}

1 Ответ

3 голосов
/ 18 марта 2019

Я бы выбрал второй вариант со следующей модификацией:

@RestController
public class SomeController {

    @Autowired
    private SomeService someService;

    @PostMapping("/parents/{parentEntityId}/childs")
    public ResponseEntity<Void> save(@PathVariable("parentEntityId") Long parentEntityId, @RequestBody ChildDto childDto) {
            someService.saveChild(parentEntityId, childDto);
            return ResponseEntity.created(...).build();
    }
}

public class SomeServiceImpl {

    @Autowired
    private ParentEntityRepository parentEntityRepository;

    @Autowired
    private ChildEntityRepository childEntityRepository;

    public ChildEntity saveChild(final long parentEntityId, final ChildDto childDto){
        ChildEntity childEntity = childDtoMapper.fromDto(childDto);
        Optional<ParentEntity> parentEntity = parentEntityRepository.findById(parentEntityId);
        if (parentEntity.isPresent()) {
            childEntity.setParent(parentEntity.get());
            childEntityRepository.save(childEntity);
            return childEntity;
        }
        throw new EntityNotFoundException("Parent entity not found!");
    }
}

Учтите, что таким образом у контроллера почти нет логики: он просто перенаправляет запросы в соответствующую службу, действуя как контроллер трафика.Кроме того, используя этот подход, когда-нибудь в будущем вам придется добавить какой-нибудь «альтернативный» контроллер, такой как WebSocket или WebService старого стиля, ваши усилия для этого будут минимальными, и вы сведете к минимуму сходство между этим контроллером и любым будущимконтроллер.Золотое правило этого подхода заключается в следующем: DAOs / Repository всегда возвращает сущности, Service всегда возвращает DTO.Контроллеры - это просто интерфейсы для внешнего мира.

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