当前位置: 首页 > news >正文

SpringBoot进阶笔记

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

适用场景

当项目中有多个模块(如 apiadminmobile 等)时,希望不同包下的所有 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
http://www.jsqmd.com/news/1176022/

相关文章:

  • 汇川easyPLC_小白免费入门100步_71步_ST_CASE语句
  • 2026年7月最新重庆雷达官方售后服务热线与网点地址查询 - 亨得利钟表维修中心
  • 具身智能跨模态桥梁:TVA与VLA的互补与渗透(16)
  • ProceduralDungeon高级技巧:如何自定义房间约束与生成规则
  • 深度学习入门(自用)
  • PyQt6 检测串口设备热插拔的方法
  • 终极LED徽章编程指南:led-name-badge-ls32 USB-HID工具完全上手教程
  • MaterialValues项目迁移指南:从旧版本升级到最新版本
  • 课堂教学PPT模板哪家强?4大平台实测对比,老师备课实用参考 - 品牌测评鉴赏家
  • 终极 .NET WebSocket 客户端库:gh_mirrors/webso/websocket-client 完全指南
  • jest-when高级技巧:函数匹配器与allArgs实现复杂参数校验
  • SQL自然语言转写Text-to-SQL:让数据查询更智能
  • 2026年7月最新帝舵龙湖天津梅江天街维修保养服务电话 - 帝舵中国官方服务中心
  • 活动策划PPT模板哪家强?6个封神网站,告别熬夜改稿! - 品牌测评鉴赏家
  • 解决Jest Mock常见痛点:jest-when实战案例与最佳实践
  • 如何快速使用Perfsee进行前端应用性能诊断:从入门到精通的完整指南
  • 2026上海旧房改造公司怎么选不后悔?内行人推荐这5家,益鸟美居排第一 - 优家闲谈
  • [企业AI落地] 用 Open WebUI + Ollama 做局域网资料助手,上线前需要注意些什么?
  • p5.js-svg未来展望:即将推出的新功能与改进路线图
  • 从0到1开发反爬脚本:基于selenium-stealth的完整项目教程
  • Redux-cycles性能优化指南:提升响应式Redux应用的5个实用技巧
  • CVPR 2023开源项目IP_LAP:论文精读与代码实现对照解读
  • FP8量化技术深度解析:llama-nemotron-embed-vl-1b-v2-fp8的精度保持秘诀
  • 广州卖 LV 怕线上虚高报价?2026 实测中检实体门店全程录像鉴定 - 每日生活报
  • 【信息科学与工程学】【数据中心】第三十二篇 云数据中心的计算/存储/网络的核心挑战02
  • git统计报表
  • 具身智能跨模态桥梁:TVA与VLA的互补与渗透(17)
  • NVIDIA-Nemotron-Labs-3-Elastic-30B-A3B-FP8:革命性3合1弹性大语言模型深度解析
  • 从代码到Storyboard:ComplimentaryGradientView的两种集成方式对比
  • Midjourney材质控制黄金三角:--style raw + --stylize 1000 + 材质锚点词(含12个经实验室验证的不可替换核心词)