Spring Boot 按包统一添加路由前缀

Spring Boot 按包统一添加路由前缀

适用场景

当项目中有多个模块(如 apiadminmobile 等)时,希望不同包下的所有 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
posted @ 2026-07-12 19:51  畅畅c  阅读(11)  评论(0)    收藏  举报