Odpowienie mapowanie przy kilku kontrolerach spring

0

W celach edukacyjnch tworze prosta aplikacje, ktorej zadaniem jest tworzenie dziennika treningowego tj. trainingLog zawiera exerciseLog, a exerciseLog zawiera seriesLog. Rozbiłem to na kilka kontrolerów m.in kontroler trainingLog, exerciseLog, seriesLog. Nie bardzo wiem jaki sposób mapowania api bedzie w tej sytuacji najlepszy.
Na chwile obecna mam cos takiego:

@RestController
@RequestMapping("/seriesLog")
public class SeriesLogController {

    @Autowired
    SeriesLogService seriesLogService;

    @PostMapping("/{exerciseLog}")
    @ResponseStatus(HttpStatus.CREATED)
    public void addSeries(@RequestBody SeriesLog seriesLog, @PathVariable ExerciseLog exerciseLog) {
        if (exerciseLog == null)
            throw new ExerciseNotFoundException("cannot add series into non-existing exercise log");
        seriesLogService.addSeriesToExerciseLog(seriesLog, exerciseLog);
    }
}
@RestController
@RequestMapping("/exerciseLog")
public class ExerciseLogController {

    @Autowired
    ExerciseLogService exerciseLogService;

    @PostMapping("/{trainingLog}/{exerciseTitle}")
    @ResponseStatus(HttpStatus.CREATED)
    public void addExerciseLog(@PathVariable TrainingLog trainingLog, @PathVariable String exerciseTitle) {
        exerciseLogService.addExerciseLogToTrainingLog(trainingLog, exerciseTitle);
    }
}
@RestController
@RequestMapping("/trainingLog")
public class TrainingLogController {

    @Autowired
    TrainingLogService trainingLogService;

   @PostMapping
    @ResponseStatus(HttpStatus.CREATED)
    public void createTrainingLog(@RequestParam LocalDate trainingDate) {
        trainingLogService.addTrainingLog(trainingDate);
    }
}

Drugi pomysł, to dodawanie tego wszystkiego w TrainingLogControllerze ale wtedy zrobi sie tam niezly bajzel :(

0

A może hierarchicznie?
trainings/ - lista treningow
training/{ID}/excercises/ - lista cwiczen
training/{ID}/excercise/{TITLE/ID}/series - lista serii
Generalnie musiałbyś mieć to wszystko w 1 kontrolerze, ale skoro jest relacja między tymi bytami, a ty masz 3 serwisy to możesz to ubrać w fasadę np (captain obvious) TrainingFacade i ona bylaby odpowiedzialna za cały moduł dotyczący treningów

0

Tak chyba faktycznie będzie najlepiej, przynajmniej dla osoby konsumującej te api. Dzięki

PS: Jak rzucam jakimś wyjątkiem z HTTP.STATUS, to rzucać go od razu w kontrolerze, czy w serwisie? Wydaje mi się, że w serwisie, ale wole się upewnić :D

1

To zależy. Jeżeli jest to wyjątek biznesowy to rzucasz w serwisie i potem tłumaczysz, np. przez ControllerAdvice. Jeżeli jest to wyjątek związany z tłumaczeniem samego requestu, zanim wpuścisz go do częsci biznesowej to w kontrolerze. Niezaleznie od tego jak zaadnotujesz wyjatek, ale w serwisach bym unikal adnotacji zwiazanych z HTTP i ogolem wszystkim co nie jest zwiazane z 'biznesem'.

0

dzięki, jeszcze się tylko dopytam bo to dla mnie nowe podejście - trainingFacade to ma byc kontroler do tych hierarchicznych zapytań, czy serwis, ktory bedzie zarzadzal pozostalymi trzema serwisami?

1 użytkowników online, w tym zalogowanych: 0, gości: 1