Spring Boot 按包统一添加路由前缀
适用场景
当项目中有多个模块(如 api、admin、mobile 等)时,希望不同包下的所有 Controller 自动添加统一的路由前缀,而无需在每个 Controller 中重复编写。
配置步骤
1. 创建配置类
实现 WebMvcConfigurer 接口,并重写 configurePathMatch() 方法。
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic 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