Как можно чейнить контроллеры в spring?
Например, создаётся какая-то API-шка v1, путь к ней /api/v1. Я хочу сделать что-то вроде
@RestController
@RequestMapping("/api")
public class ApiController {
@RequestMapping("/v1")
public ... v1Controller(какие-то аргументы) {
Связь с UserController /user
Связь с CourseController /course
...
}
@RequestMapping("/v2")
public ... v2Controller(какие-то аргументы) {
Связь с UserController /user
Связь с CourseController /course
...
}
}
То есть общая идея такая, что есть несколько контроллеров, которые обрабатывают разные эндпоинты, но у всех у них есть общая часть в RequestMapping, а именно /api/vНОМЕР. Хочется избавиться от этой части... Где-то прописать 1 раз и дальше пользоваться. Это вообще реализуемо здесь на базовом уровне? Или придётся писать каждый раз в маппинг /api/vНОМЕР?
Так как может не совсем быть понятным (так-как я пришёл из ноды), как вы выстраиваете роутинги? То есть в каждом контроллере прописываете full path? (аля /api/v1/student/{id}, вместо того, чтобы поднять 1 какой-то объект, в котором было бы /api, потом в другом объекте получать информацию по версии, а дальше уже выстраивать эндпоинты)
Ответы (2 шт):
Если я правильно понял задачу (и что позволяет спринг согласно этой ссылке) то можно так сделать:
@Controller
@RequestMapping("/api")
public class ParentController {
@RequestMapping("/someAction")
public String someAction() {
return "someAction"
}
}
@Controller
@RequestMapping("/v1")
public class V1Controller extends ParentController {
@RequestMapping("/someAction")
public String someActionV1() {
return "someActionV1"
}
}
@Controller
@RequestMapping("/v2")
public class V1Controller extends ParentController {
@RequestMapping("/someAction")
public String someActionV2() {
return "someActionV2"
}
}
Соответственно должно быть возможно теперь делать такие запросы:
http://localhost:8080/<Project>/api/someAction
http://localhost:8080/<Project>/api/v1/someAction
http://localhost:8080/<Project>/api/v2/someAction
есть несколько контроллеров, которые обрабатывают разные эндпоинты, но у всех у них есть общая часть в RequestMapping, а именно /api/vНОМЕР. Хочется избавиться от этой части... Где-то прописать 1 раз и дальше пользоваться.
Например можно прописать в application.prolerties:
v1API=/api/v1
далее используется springEL для того, чтобы добавить префикс к пути контроллера.
@RestController
@RequestMapping("${v1API}")
public class ApiController {
...