Как можно чейнить контроллеры в 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

→ Ссылка
Автор решения: Roman C

есть несколько контроллеров, которые обрабатывают разные эндпоинты, но у всех у них есть общая часть в RequestMapping, а именно /api/vНОМЕР. Хочется избавиться от этой части... Где-то прописать 1 раз и дальше пользоваться.

Например можно прописать в application.prolerties:

v1API=/api/v1

далее используется springEL для того, чтобы добавить префикс к пути контроллера.

@RestController
@RequestMapping("${v1API}")
public class ApiController {
...
→ Ссылка