Odpowienie mapowanie przy kilku kontrolerach spring

Odpowienie mapowanie przy kilku kontrolerach spring
  • Rejestracja: dni
  • Ostatnio: dni
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:

Kopiuj
@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);
    }
}
Kopiuj
@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);
    }
}
Kopiuj
@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 :(

hcubyc
  • Rejestracja: dni
  • Ostatnio: dni
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

  • Rejestracja: dni
  • Ostatnio: dni
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

hcubyc
  • Rejestracja: dni
  • Ostatnio: dni
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'.

  • Rejestracja: dni
  • Ostatnio: dni
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?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.