Spring Boot 按包统一添加路由前缀
Spring Boot 按包统一添加路由前缀
适用场景
当项目中有多个模块(如 api、admin、mobile 等)时,希望不同包下的所有 Controller 自动添加统一的路由前缀,而无需在每个 Controller 中重复编写。
配置步骤
1. 创建配置类
实现 WebMvcConfigurer 接口,并重写 configurePathMatch() 方法。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
// controller.api 包下自动添加 /api 前缀
configurer.addPathPrefix(
"/api",
clazz -> clazz.getPackageName()
.startsWith("com.example.demo.controller.api")
);
// controller.admin 包下自动添加 /admin 前缀
configurer.addPathPrefix(
"/admin",
clazz -> clazz.getPackageName()
.startsWith("com.example.demo.controller.admin")
);
}
}
将
com.example.demo修改为自己的项目包名。
2. Controller 按包存放
controller
├── api
│ └── UserController.java
├── admin
│ └── AdminController.java
└── web
└── HomeController.java
3. 正常编写 Controller
无需手动写前缀:
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/list")
public String list() {
return "ok";
}
}
最终访问路径:
/api/user/list
addPathPrefix() 方法
configurer.addPathPrefix(String prefix, Predicate<Class<?>> predicate);
参数说明:
| 参数 | 说明 |
|---|---|
prefix |
要添加的路由前缀,如 /api |
predicate |
判断哪些 Controller 需要添加该前缀,返回 true 则添加 |
例如:
clazz -> clazz.getPackageName().startsWith("com.example.demo.controller.api")
表示:
当 Controller 所在包以
com.example.demo.controller.api开头时,自动添加/api前缀。
示例
原始 Controller:
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/list")
public String list() {
return "ok";
}
}
所在包:
com.example.demo.controller.api
配置:
configurer.addPathPrefix(
"/api",
clazz -> clazz.getPackageName()
.startsWith("com.example.demo.controller.api")
);
最终访问地址:
/api/user/list
无需修改 Controller 中的任何路由。
原理
Spring Boot 启动时会扫描所有 Controller,对于满足 predicate 条件的类,自动将指定的前缀拼接到类上的 @RequestMapping 前面。
例如:
@RequestMapping("/user")
↓
自动添加 /api
↓
/api/user
再结合方法上的:
@GetMapping("/list")
最终得到:
/api/user/list

浙公网安备 33010602011771号