cot_shaurma
@cot_shaurma
Java и всего понемногу

Как сделать два метода на один эндпоинт в REST-контроллере Spring?

У меня есть несколько ролей и один эндпоинт. Столкнулся с такой ситуацией, что для каждой роли нужен свой набора параметров. Ну вот, например, есть роль CONSUMER и есть роль PRODUCER. И есть эндпоинт, к которому обе роли имеют доступ:

@PostMapping("/order")
public void pay(@RequestParam(value = "consumer-id") Integer consumerId,
                         @RequestParam(value = "consumer-region-code") Integer regionCode,
                         @AuthenticationPrincipal AuthorizedUser user) {
    ...
}

На самом деле для пользователя CONSUMER здесь было бы достаточно иметь только принципал. А вот для пользователя PRODUCER нужен только consumerId и regionCode, зато не нужен принципал. Из-за этого метод очень сильно разрастается, каждая роль привносит что-то новое. В идеале было бы сделать два отдельных метода на один эндпоинт:
@PostMapping("/order")
public void pay(@AuthenticationPrincipal AuthorizedUser user) {
    ...
}

@PostMapping("/order")
public void pay(@RequestParam(value = "consumer-id") Integer consumerId,
                         @RequestParam(value = "consumer-region-code") Integer regionCode) {
    ...
}

Но тут Spring ошибку бросит. Как я могу решить данную проблему с лишними параметрами и разрастанием методов?
  • Вопрос задан
  • 933 просмотра
Решения вопроса 1
BorLaze
@BorLaze
Java developer
Пригласить эксперта
Ответы на вопрос 1
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
А почему бы вместо этого:
@PostMapping("/order")
public void pay(@AuthenticationPrincipal AuthorizedUser user) {
    ...
}

@PostMapping("/order")
public void pay(@RequestParam(value = "consumer-id") Integer consumerId,
                         @RequestParam(value = "consumer-region-code") Integer regionCode) {
    ...
}


не использовать:

@PostMapping("/order")
public void pay(
@AuthenticationPrincipal AuthorizedUser user,
@RequestParam(value = "consumer-id", required = false) Integer consumerId,
@RequestParam(value = "consumer-region-code", required = false) Integer regionCode
) {
    ...
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы