SpringBoot如何根据目录结构生成API接口前缀
一、根据目录结构生成接口前缀
在写api的接口时,通常有很多版本的迭代,比如:v1、v2。
如图所示,建立的包结构。

列举v1版本,每新建一个controller都要写上@RequestMapping("/v1/****")的路由的前缀,如果v1下面还有几个包结构,这样路由就要写的很麻烦。
我们可以通过当前api下的目录结构自动加上请求前缀。
二、自定义RequestMappingInfo
在Spring里有一个专门处理拥有@RequestMapping()注解的控制器的类(RequestMappingHandlerMapping),因为我们要修改控制器的路由。
- 写一个类继承RequestMappingHandlerMapping,重写类的getMappingForMethod方法。这个方法就是定义和生成路由。
- 调用基类的getMappingForMethod方法就能拿到RequestMappingInfo 的路由信息,先接受信息,修改完了,再返回。
- 这里要进行路由前缀的修改,封装一个方法getPrefix(),而handlerType这个参数就是获取控制器的信息。
- 获取控制器的目录结构,进行替换,保留api目录之后的路径。
- 这里的apiPackagePath,就是com.api。指定api是所有api的根目录。
- 获取到的请求路径是.,替换为/。
- 得到了prefix前缀,修改MappingInfo。通过RequestMappingInfo的静态方法合并url。
public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {
@Value("${api-package}")
private String apiPackagePath;
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
RequestMappingInfo mappingForMethod = super.getMappingForMethod(method, handlerType);
String prefix = getPrefix(handlerType);
if (mappingForMethod!=null){
return RequestMappingInfo.paths(prefix).build().combine(mappingForMethod);
}
return mappingForMethod;
}
private String getPrefix(Class<?> handlerType){
String packageName = handlerType.getPackage().getName();
String doPath = packageName.replaceAll(this.apiPackagePath, "");
return doPath.replace('.', '/');
}
}
- 配置类的方法将AutoPrefixUrlMapping类注入ioc容器中。
- 新建一个配置类继承WebMvcRegistrations接口。实现getRequestMappingHandlerMapping方法,直接实例化AutoPrefixUrlMapping。
- 将配置类加入容器中@Component
@Component
public class AutoPrefixConfiguration implements WebMvcRegistrations {
@Override
public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
return new AutoPrefixUrlMapping();
}
}
三、测试
在v1包下新建一个controller
@RestController()
@RequestMapping("/banner")
public class BannerController {
@GetMapping("/test")
public String test() {
return "你好 hello";
}
}
启动主程序,测试接口http://localhost:8080/v1/banner/test,
自动合并了路由,v1是自动拼接的。

将controller移动到v2的sample包下,controller的请求路径没有修改。

这是重新服务再访问http://localhost:8080/v2/sample/banner/test。

成功访问,不管目录多么复杂都实现了根据目录结构生成路由前缀,不用修改控制器的requestMapping。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
- SpringBoot3整合SpringDoc OpenAPI生成接口文档的详细过程
- 关于springboot忽略接口,参数注解的使用ApiIgnore
- Springboot+Redis实现API接口防刷限流的项目实践
- SpringBoot 快速实现 api 接口加解密功能
- 详解Springboot快速搭建跨域API接口的步骤(idea社区版2023.1.4+apache-maven-3.9.3-bin)
- SpringBoot整合Sa-Token实现 API 接口签名安全校验功能
- SpringBoot可视化接口开发工具magic-api的简单使用教程
- SpringBoot实现API接口的完整代码
- springboot接入方式对接股票数据源API接口的操作方法
相关文章
JAVA利用HttpClient进行POST请求(HTTPS)实例
下面小编就为大家带来一篇JAVA利用HttpClient进行POST请求(HTTPS)实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起 小编过来看看吧2016-11-11
详解SpringMVC的url-pattern配置及原理剖析
这篇文章主要介绍了SpringMVC的url-pattern配置及原理剖析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2020-06-06
Java传入用户名和密码并自动提交表单实现登录到其他系统的实例代码
这篇文章主要介绍了Java传入用户名和密码并自动提交表单实现登录到其他系统,非常不错,具有参考借鉴价值,需要的朋友可以参考下2017-01-01
Java 8跳过本次循环,继续执行以及跳出循环,终止循环的代码实例
今天小编就为大家分享一篇关于Java 8跳过本次循环,继续执行以及跳出循环,终止循环的代码实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-10-10
SpringBoot+Redis布隆过滤器防恶意流量击穿缓存
本文主要介绍了SpringBoot+Redis布隆过滤器防恶意流量击穿缓存,文中根据实例编码详细介绍的十分详尽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下2022-03-03
Spring BeanPostProcessor源码示例解析
这篇文章主要为大家介绍了Spring BeanPostProcessor源码示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-01-01


最新评论