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

作者:三毛村滴雪鱼粉 时间:2023-01-31 14:04:29 

在很多其他框架中,比如Python的Flask、node.js的KOA,Controller要想能够响应前端的请求都需要我们主动去注册到应用程序上。而Spring不需要我们自己去注册,由Spring通过扫描注解的方式去主动发现

自定义RequestMappingInfo

Spring中的RequestMappingHandlerMapping专门来负责处理标注了@RequestMapping的控制器。创建一个类继承并覆盖其中的方法,从而实现对默认机制的修改。

覆盖其中的getMappingForMethod方法,这个方法的返回值RequestMappingInfo就包含了请求的Url,修改RequestMappingInfo中的Url从而修改路由中的Url。


package com.lin.missyou.hack;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import java.lang.reflect.Method;
public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {
   @Value("${missyou.api-package}")
   private String apiPackagePath ;//从配置文件中获取根包的路径
   @Override
   protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
       RequestMappingInfo requestMappingInfo = super.getMappingForMethod(method, handlerType);
       if(null != requestMappingInfo){
       //获取url前缀
           String prefix = getPrefix(handlerType);
           //根据url前缀生成RequestMappingInfo并与原有的RequestMappingInfo合并
           RequestMappingInfo mappingInfo = RequestMappingInfo.paths(prefix).build().combine(requestMappingInfo);
           return mappingInfo;
       }
       return requestMappingInfo;
   }
   private String getPrefix(Class<?> handlerType){
       String packageName = handlerType.getPackage().getName();//获取控制器所在包路径
       String dotPath = packageName.replaceAll(this.apiPackagePath,"");//将包路径中多于的部分截取掉
       return dotPath.replace(".","/");//将包路径中的.替换成/
   }
}

通过接口的形式发现类

创建一个配置类AutoPrefixConfiguration将AutoPrefixUrlMapping加入到容器。配置类AutoPrefixConfiguration实现接口WebMvcRegistrations并覆盖其中的getRequestMappingHandlerMapping方法


package com.lin.missyou.core.config;
import com.lin.missyou.hack.AutoPrefixUrlMapping;
import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
@Component
public class AutoPrefixConfiguration implements WebMvcRegistrations {
   @Override
   public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {
       return new AutoPrefixUrlMapping();
   }
}

在配置文件中指定根包


missyou.api-package = com.lin.missyou.api

SprinBoot的 发现机制 有两种。一种是在控制器上标注特定注解,例如上一篇文章SpringBoot全局异常处理中在GlobalExceptionAdvice 上标注@ControllerAdvice。另外一种是实现特定接口并覆盖其中的特定方法,例如上面的AutoPrefixConfiguration。

测试一下

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

访问结果,访问路径/v1/banner/test可以访问到该控制器

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

将访问路径改为/banner/test就访问不到了

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

将BannerController移动到sample文件夹下访问路径/v1/sample/banner/test可以访问到该控制器

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

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

这个方法存在一些争议。一方面认为根据目录结构自动生成url虽然比较简单,少写了一些代码,但是无法通过控制器上标注的@RequestMapping中的参数直接看出url,代码的可读性不是太好。

另一方面认为,这个方法大大的简化了我们代码的编写,同时更加易于维护,控制器随意调整所在目录都不需要去修改代码。

来源:https://blog.csdn.net/xfx_1994/article/details/104108226

标签:SpringBoot,配置,Url前缀
0
投稿

猜你喜欢

  • Android资源文件与层次式导航超详细讲解

    2022-07-14 16:28:22
  • C#仿QQ实现简单的截图功能

    2021-10-11 16:43:15
  • java微信公众号开发第一步 公众号接入和access_token管理

    2022-04-21 23:06:41
  • SpringBoot实现阿里云短信发送的示例代码

    2023-05-15 21:08:54
  • C#使用for循环移除HTML标记

    2022-02-02 08:35:23
  • SpringCloud Eureka服务注册中心应用入门详解

    2022-02-23 08:48:44
  • Android登录记住多个密码的实现方法

    2021-12-08 00:33:15
  • Json字符串转Java对象和List代码实例

    2022-03-11 15:47:09
  • java中Memcached的使用实例(包括与Spring整合)

    2021-11-28 13:29:06
  • C#给Word不同页面设置不同背景

    2021-07-20 01:28:16
  • Java加载资源文件时的路径问题的解决办法

    2023-05-09 23:22:40
  • Android使用glide加载gif动画设置播放次数

    2022-06-20 03:59:46
  • 为Android应用增加渠道信息 自动化不同渠道的打包过程的使用详解

    2022-06-01 11:38:22
  • C#通过流写入一行数据到文件的方法

    2023-08-22 13:04:08
  • C#表达式和运算符详细解析

    2021-09-30 23:39:09
  • 基于Android LayoutInflater的使用介绍

    2023-12-22 23:50:03
  • .NET/C#实现识别用户访问设备的方法

    2021-12-20 06:30:58
  • C语言连续生成多个随机数实现可限制范围

    2023-08-24 08:35:06
  • 使用java从乱码文本中解析出正确的文本

    2023-12-03 12:10:22
  • 详解Spring Security如何配置JSON登录

    2023-02-08 17:39:07
  • asp之家 软件编程 m.aspxhome.com