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

目录
  • 一、根据目录结构生成接口前缀
  • 二、自定义RequestMappingInfo
  • 三、测试

一、根据目录结构生成接口前缀

在写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。

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

(0)

相关推荐

  • SpringBoot根据目录结构自动配置Url前缀方式

    目录 自定义RequestMappingInfo 通过接口的形式发现类 在很多其他框架中,比如Python的Flask.node.js的KOA,Controller要想能够响应前端的请求都需要我们主动去注册到应用程序上.而Spring不需要我们自己去注册,由Spring通过扫描注解的方式去主动发现. 自定义RequestMappingInfo Spring中的RequestMappingHandlerMapping专门来负责处理标注了@RequestMapping的控制器.创建一个类继承并覆盖其

  • SpringBoot如何根据目录路径生成接口的url路径

    目录 根据目录路径生成接口的url路径 配置文件application.proprties如下 springboot接口请求界面路径返404 接口没被扫描到 配置或代码写法问题 最后 根据目录路径生成接口的url路径 首先我们新建一个AutoPrefixUrlMapping类,继承自RequestMappingHandlerMapping,用以获取新的url public class AutoPrefixUrlMapping extends RequestMappingHandlerMappin

  • SpringBoot根据目录结构自动生成路由前缀的实现代码

    目录 前言 具体实现 配置文件指定基础包 自动补全路由前缀处理类 自动补全路由前缀配置类 测试类 测试 前言 本文介绍如何根据目录结构给RequestMapping添加路由前缀(覆盖RequestMappingHandlerMapping中的getMappingForMethod方法,修改其中的Url),如下图的实际访问路径为:/v1/test/test. 具体实现 配置文件指定基础包 application.properties api-package = com.coisini.spring

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

    目录 一.根据目录结构生成接口前缀 二.自定义RequestMappingInfo 三.测试 一.根据目录结构生成接口前缀 在写api的接口时,通常有很多版本的迭代,比如:v1.v2. 如图所示,建立的包结构. 列举v1版本,每新建一个controller都要写上@RequestMapping("/v1/****")的路由的前缀,如果v1下面还有几个包结构,这样路由就要写的很麻烦. 我们可以通过当前api下的目录结构自动加上请求前缀. 二.自定义RequestMappingInfo 在

  • SpringBoot使用swagger生成api接口文档的方法详解

    目录 前言 具体例子 maven配置 项目application.yml配置 springApplication添加swagger注解 在控制层添加swagger注解 前言 在之前的文章中,使用mybatis-plus生成了对应的包,在此基础上,我们针对项目的api接口,添加swagger配置和注解,生成swagger接口文档 具体可以查看本站spring boot系列文章: spring boot项目使用mybatis-plus代码生成实例 具体例子 maven配置 在使用之前,我们需要添加s

  • Django 自动生成api接口文档教程

    最近在写测试平台,需要实现一个节点服务器的api,正好在用django,准备使用djangorestframework插件实现. 需求 实现一个接口,在调用时,通过传递的参数,直接运行对应项目的自动化测试 环境 Python3.6 ,PyCharm,W7 项目结构 功能实现 流程 我们要做的就是实现以上流程 安装 pip install djangorestframework pip install markdown pip install django-filter # Filtering s

  • PHP实现腾讯短网址生成api接口实例

    1.简要描述 腾讯短网址(url.cn短链接)生成api接口是腾讯官方对外公开的短网址生成接口,可以将一个冗长的链接缩短成10个字符以内的短链接. 2.应用场景 腾讯短网址的应用场景很广,譬如短信营销.邮件推广.微信营销.QQ营销.自媒体推广.渠道推广等都会用到短网址.究其原因是在于短网址可以降低推广成本.用户记忆成本,提高用户点击率:在特定的场景下推广还能规避关键词,防止域名被拦截,隐藏真实地址等. 3.使用说明 接口地址:http://api.monkeyapi.com      请求方式:

  • vue 项目打包通过命令修改 vue-router 模式 修改 API 接口前缀

    需求说明: 在开发 vue 项目的过程中遇到的需求是要把 api 接口前缀暴露在命令行,通过 npm run build apiUrl 即可修改接口入口,用于从 docker 部署到不同的测试服务器上,其次是路由模式的问题,部署到测试服务器上的需要是 history 模式,但是产品是用 electron + vue 开发的桌面应用,electron 硬性要求 vue-router 的路由模式是 hash 模式,所以命令行需新增一个配置项 mode ,mode 可选值有 history .hash

  • 将JavaDoc注释生成API文档的操作

    目录 将JavaDoc 注释 生成API文档 java自动api文档生成Yapi word文档缺点 swwager文档缺点 将JavaDoc 注释 生成API文档 1. 打开java代码,编写JavaDoc 注释,只有按照java的规范编写注释,才能很好的生成API文档,javadoc注释与普通注释的区别为多一个*(星号).普通代码注释为/*XXX*/,而javadoc的注释为/**XXX*/ 2. javadoc注释要尽量写的详细,这样别人在没有源码的情况下才知道如 何使用您的代码. 3. 点

  • 如何将python代码生成API接口

    目录 python代码生成API接口 1. 安装Flask 2. 编写Flask应用 3. 运行该Flaks应用 4. 使用该接口 python写api接口实战 操作步骤 源码举例 请求方式 获取请求参数的几种方法 python代码生成API接口 如果要将我们写好的Python代码生成API接口时,我们需要借助Flask框架 1. 安装Flask pip install Flask 2. 编写Flask应用 (1)新建python文件 app.py(注意创建的Python文件名不能为flask.

随机推荐