SpringBoot + 指定包下所有控制器 + 添加统一前缀

自定义版本控制器接口定义

提供两个方法,一个方法是需要添加url前缀的控制器所属的包名称,一个是需要添加的url前缀。

/**

* 版本控制器

*

* @author Hanqi

* @since 2019/3/13 16:11

*/

public interface VersionHandler {

/**

* 需要处理的控制器所处的包名

*/

String getPackageName();

/**

* 需要添加的前缀

*/

String getPrefix();

}

简单的版本控制器实现

import org.springframework.stereotype.Component;

/**

* 版本控制实例

* @author Hanqi

* @since 2019/3/13 16:11

*/

@Component

public class TwoVersionHandler implements VersionHandler {

@Override

public String getPackageName() {

return "com.uustore.uustoreapi.controller";

}

@Override

public String getPrefix() {

return "v2";

}

}

实现添加url前缀核心方法的请求映射处理器

import org.springframework.util.CollectionUtils;

import org.springframework.web.servlet.mvc.method.RequestMappingInfo;

import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

import java.lang.reflect.Method;

import java.util.HashSet;

import java.util.Set;

public class VersionControlRequestMappingHandlerMapping extends RequestMappingHandlerMapping {

protected Set versionHandlers;

protected boolean hasVersionHandler = false;

@Override

public void afterPropertiesSet() {

// 初始化版本控制器类型集合

initVersionHandlers();

super.afterPropertiesSet();

}

@Override

protected void initHandlerMethods() {

super.initHandlerMethods();

}

@Override

protected RequestMappingInfo getMappingForMethod(Method method, Class> handlerType) {

RequestMappingInfo info = super.getMappingForMethod(method, handlerType);

if (info != null) {

final String packageName = handlerType.getPackage().getName();

for (VersionHandler versionHandler : versionHandlers) {

if (packageName.startsWith(versionHandler.getPackageName())) {

RequestMappingInfo versionInfo = buildRequestMappingInfo(versionHandler.getPrefix());

info = versionInfo.combine(info);

return info;

}

}

}

return info;

}

protected void initVersionHandlers() {

versionHandlers = new HashSet<>(obtainApplicationContext().getBeansOfType(VersionHandler.class).values());

hasVersionHandler = !CollectionUtils.isEmpty(versionHandlers);

}

protected RequestMappingInfo buildRequestMappingInfo(String path) {

return RequestMappingInfo.paths(path).build();

}

}

注册使用自定义的请求映射处理器

import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;

import org.springframework.context.annotation.Configuration;

import org.springframework.core.Ordered;

import org.springframework.core.annotation.Order;

import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;

/**

* 配置使用自定义版本url处理器

*

* @author Hanqi

* @since 2019/3/13 16:11

*/

@Configuration

@Order(Ordered.HIGHEST_PRECEDENCE)

public class VersionControlWebMvcConfiguration implements WebMvcRegistrations {

@Override

public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {

return new VersionControlRequestMappingHandlerMapping();

}

}

springboot 前缀_SpringBoot + 指定包下所有控制器 + 添加统一前缀相关推荐

  1. springboot 前缀_SpringBoot2.x 给Controller的RequestMapping添加统一前缀

    如何给Controller的RequestMapping添加统一前缀,比如"/api",为什么要添加统一访问前缀,其实是为了后面的接口的管理. 切记:约定与规范好过一切技术处理 ! ...

  2. Spring Boot 自动加载指定包下的拦截器

    Spring Boot 在我们需要对程序添加拦截器需要使用 WebMvcConfigurerAdapter 中的 addInterceptors方法去注册拦截器,这样我们如果在程序里面有多个拦截或者我 ...

  3. Java:SpringBoot给Controller添加统一路由前缀

    网上的文章五花八门,不写SpringBoot的版本号,导致代码拿来主义不好使了. 本文采用的版本 SpringBoot 2.7.7 Java 1.8 目录 1.默认访问路径 2.整个项目增加路由前缀 ...

  4. 004 关于Java如何扫描指定package下所有的类

    q前言: 在工作中看到这个知识点,就顺便参考了百度的一些资料,整理一下,希望以后用的到. 一:理论部分 1.使用场景 写一个MVC框架,需要从包中扫描出组件并注册到容器中,而JDK没有提供现成的从方法 ...

  5. java 扫描jar包_java 扫描指定包(包括jar包)

    /*未经本人同意,禁止转载. 做工程时,有时候需要扫描指定包,或者指定jar包,甚至扫描指定包下指定类,本文章详细讲解如何扫描,以及智能扫描,小编讲的很详细了仔细看. 以下讲解, 包扫描和jar包扫描 ...

  6. 如何批量添加文件名前缀?

    如何批量添加文件名前缀?我们每个人在平时可能会遇到各种不同的工作,并且每项工作会产生大量的文件,电脑里的文件多了就会产生混淆,为了更好的管理这些不同项目中涉及到的文件,我们可以给相同项目的文件的名称前 ...

  7. Window批量添加文件名前缀

    在Windows系统中,有时我们需要给多个文件添加相同的前缀,可以使用以下方式进行处理. 在需要添加前缀的文件的同级目录下,新建一个记事本 .txt 文件,然后将下面的代码复制到记事本里面,把&quo ...

  8. Spring Boot 接口统一前缀

    需求 需求如题,想给一个 spring boot 项目的所有请求路径添加统一前缀,可以通过 context-path 来配置.但是在同时存在静态资源和 Controller 接口的项目中,如果希望静态 ...

  9. R语言使用fs包的dir_create函数在指定路径下创建新的文件夹、使用file_create函数在指定文件夹下创建文件

    R语言使用fs包的dir_create函数在指定路径下创建新的文件夹.使用file_create函数在指定文件夹下创建文件 目录

最新文章

  1. 完整的虚幻引擎超级课程:从初学者到专家
  2. [转贴]电阻电容的封装形式如何选择
  3. ajax跨域问题解决方案
  4. P4550 收集邮票-洛谷luogu
  5. Linux下svn新建用户,Linux下建立svn工程
  6. WPF Grid添加边框的两种方法
  7. 牛客练习赛 67——ST表
  8. 在Mysql中显示所有用户的操作教程(Linux环境下)
  9. 【HDOJ】4602 Partition
  10. 小米(MIUI)系统组招聘职位
  11. 作为开发者发布小程序_如何建立个人品牌作为新开发者
  12. VC2005 C++入门记
  13. python 自动化框架_学会Python+Selenium,分分钟搭建Web自动化框架!
  14. Sleutel:密码治理器
  15. python怎么读取中文文件-python: py2下 中文 的 文件读写 及 打印
  16. Google及其云智慧
  17. 21计算机考研上岸经验分享(一战成硕,普通双非逆袭顶级211)
  18. vscode java
  19. 1.2 安装 docker 容器并配置镜像加速器
  20. ​EMNLP 2022 | 预训练语言模型的时空效率优化

热门文章

  1. 紫禁城里“冷宫”在哪儿? 故宫的六大宫廷之迷
  2. Vczh Library++3.0 开源啦!
  3. CSS:实现一个斑马线效果 (条纹背景)
  4. 《Android Studio开发实战 从零基础到App上线(第3版)》出版后记
  5. TensorFlow-Slim基础使用
  6. HTTP协议-简单学习
  7. 网易新闻IOS客户端
  8. macOS Monterey 12.6.7 (21G651) 正式版发布,ISO、IPSW、PKG 下载
  9. 万兆局域网方案_组建万兆局域网对网络设备的要求 (原创)
  10. {YiGeZiWoJianJie}个人简历(还没写完呢)