У меня есть один Java REST API, который используется двумя разными потребителями. По умолчанию принципы REST мой API должен определять имена заголовков запросов. Но сейчас у меня не обычная ситуация. Потребители используют разные уровни безопасности, которые обеспечивают разные заголовки, что означает одинаковый параметр в обоих направлениях.
Пример метода: (не реальный код)
Для 1-го потребителя:
@PostMapping("/number")
Integer getNumber(@RequestHeader("no") String number, @RequestBody User user) {
/*...*/
}
Для 2-го потребителя:
@PostMapping("/number")
Integer getNumber(@RequestHeader("number") String number, @RequestBody User user) {
/*...*/
}
У меня до 10 методов в одном контроллере, и они должны иметь одинаковые имена и логики c, но разные заголовки. Префикс пути запроса может быть другим.
Вопрос:
Как упростить контроллер REST и не создавать 2 разных контроллера с одинаковыми методами и одинаковыми логами c?
Что я пробовал:
Я попробовал несколько примеров, чтобы создать один контроллер с 2 разными интерфейсами с одинаковыми методами, но с разным отображением.
Пример:
Класс контроллера
@RestController
@RequestMapping(path ="/application")
@Api(tags = {"application"})
public class ApplicationController implements AppMapping1, AppMapping2 {
@Override
public Integer getNumber(String number, User user) {
/*...*/
}
}
Первый интерфейс
interface AppMapping1 {
@PostMapping("/num")
Integer getNumber(@RequestHeader("num") String number, @RequestBody User user);
}
Второй интерфейс
interface AppMapping2 {
@PostMapping("/number")
Integer getNumber(@RequestHeader("number") String number, @RequestBody User user);
}
Результат:
Контроллер сопоставляется только с первым интерфейсом. Так что http://.../application/num
работает нормально, но http://.../application/number
- получает 404
код ошибки. Это означает, что Java Spring-Boot не имеет такой функциональности. Нужны еще идеи.
Проект разработан с Java 8
; spring-boot:2.1.1.RELEASE
; gradle