SpringBoot如何根据目录结构生成API接口前缀

 更新时间:2022年02月18日 10:17:32   作者:Y7000也拯救不了我  
这篇文章主要介绍了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。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 详解idea中web.xml默认版本问题解决

    详解idea中web.xml默认版本问题解决

    这篇文章主要介绍了详解idea中web.xml默认版本问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • Json转化为Java对象的实例详解

    Json转化为Java对象的实例详解

    这篇文章主要介绍了Json转化为Java对象的实例详解的相关资料,前后端数据交互的情况经常会遇到Json串与java 对象的相互转换方便操作,需要的朋友可以参考下
    2017-08-08
  • 解决springboot 启动找不到主类的问题

    解决springboot 启动找不到主类的问题

    这篇文章主要介绍了解决springboot 启动找不到主类的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 基于IntBuffer类的基本用法(详解)

    基于IntBuffer类的基本用法(详解)

    下面小编就为大家带来一篇基于IntBuffer类的基本用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java如何调用Matlab程序

    Java如何调用Matlab程序

    这篇文章主要介绍了Java如何调用Matlab程序的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot中的静态资源访问的实现

    SpringBoot中的静态资源访问的实现

    这篇文章主要介绍了SpringBoot中的静态资源访问的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 解决javac不是内部或外部命令,也不是可运行程序的报错问题

    解决javac不是内部或外部命令,也不是可运行程序的报错问题

    在学着使用Java的命令行来编译java文件的时候,遇到了这个问题,本文主要介绍了解决javac不是内部或外部命令,也不是可运行程序的报错问题,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-04-04
  • 解决Request.getParameter获取不到特殊字符bug问题

    解决Request.getParameter获取不到特殊字符bug问题

    这篇文章主要介绍了解决Request.getParameter获取不到特殊字符bug问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • SpringCloud如何创建一个服务提供者provider

    SpringCloud如何创建一个服务提供者provider

    这篇文章主要介绍了SpringCloud如何创建一个服务提供者provider,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Java实现ATM系统超全面步骤解读建议收藏

    Java实现ATM系统超全面步骤解读建议收藏

    这篇文章主要为大家详细介绍了用Java实现简单ATM机功能,文中实现流程写的非常清晰全面,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03

最新评论