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。
测试一下
访问结果,访问路径/v1/banner/test可以访问到该控制器
将访问路径改为/banner/test就访问不到了
将BannerController移动到sample文件夹下访问路径/v1/sample/banner/test可以访问到该控制器
这个方法存在一些争议。一方面认为根据目录结构自动生成url虽然比较简单,少写了一些代码,但是无法通过控制器上标注的@RequestMapping中的参数直接看出url,代码的可读性不是太好。
另一方面认为,这个方法大大的简化了我们代码的编写,同时更加易于维护,控制器随意调整所在目录都不需要去修改代码。
来源:https://blog.csdn.net/xfx_1994/article/details/104108226


猜你喜欢
- 当一个产品或者项目由大量独立模块组成时,想要从 Git 挨个下载下来导入 IDE 查看并不容易,此时可以结合使用 Git 和 Maven 的
- 问题: 在win10系统中,使用IDEA 查看源码的时候,经常跳转代码,这样会让使用者感觉和方便,但是当你想要返回上次跳转的位置时,却不知道
- 基本要点1、定义根据百度百科的定义,RESTFUL是一种网络应用程序的设计风格和开发方式2、传统方式与Restful风格的区别在我们学习re
- Message Digest Algorithm MD5(中文名为消息摘要算法第五版)为计算机安全领域广泛使用的一种散列函数,是一种比较常用
- 一:什么是classpath?classpath指的就是 *.java文件,资源文件等编译后存放的位置,对于maven项目就是指 targe
- 1.非静态成员变量当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环例子:public class ConstructorCl
- FrameLayout(帧布局),LinearLayout (线性布局),AbsoluteLayout(绝对布局),RelativeLayo
- 在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果。但在多线程的异步开发
- 一. SpringBoot集成liquibase项目集成liquibase作用对数据库表字段进行版本控制项目初始化部署时初始化数据库表和数据
- 传值就是将实参的值传到所调用的函数里面,实参的值并没有发生变化,默认传值的有int型,浮点型,bo
- Java的SPI机制实例详解SPI的全名为Service Provider Interface.普通开发人员可能不熟悉,因为这个是针对厂商或
- Kotlin开发Android应用实例详解我们简单的知道了Kotlin这门新语言的优势,也接触了一些常见的语法及其简单的使用,相信你会对它有
- 前言我们之前介绍了不少有关动画的篇章。前面介绍的动画都是只有一个动画效果,那如果我们想对某个组件实现一组动效,比如下面的效果,该怎么办?st
- 我计划在后续的一段时间内,写一系列关于java 9的文章,虽然java 9 不像Java 8或者Java 11那样的核心java版本,但是还
- 背景:在Android中按照数据保存的方式,可以分为如下几种Content Provider (用的SQLite实现),SQLite,Sha
- Java是一门面向对象的语言,即一切皆是对象!那么为何数据类型中还分为:基本类型和对象?Java中有8种基本数据类型boolean、byte
- 篇首,完全没有技术含量的帖子,高手略过,只为十几年后重新捡起的我爱好玩玩。。。起因,一个朋友说他下载了很多短视频,但只需要要其中的一小截,去
- 通常在C#的实际开发过程中,会发现设置其属性ScriptErrorsSuppressed无法达到屏蔽脚本错误效果,但是可以通过下面两种方式实
- 本文列举了几个方法: 1. 使用java.math.BigDecimal &n
- ofType和javaType的区别JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型