SpringBoot根据目录结构自动配置Url前缀方式
在很多其他框架中,比如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,代码的可读性不是太好。
另一方面认为,这个方法大大的简化了我们代码的编写,同时更加易于维护,控制器随意调整所在目录都不需要去修改代码。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
SpringBoot项目使用slf4j的MDC日志打点功能(最新推荐)
这篇文章主要介绍了SpringBoot项目使用slf4j的MDC日志打点功能,本文通过示例代码给大家介绍非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-06-06
MybatisPlus使用Mybatis的XML的动态SQL的功能实现多表查询
本文主要介绍了MybatisPlus使用Mybatis的XML的动态SQL的功能实现多表查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧2023-11-11
基于Springboot+Netty实现rpc的方法 附demo
这篇文章主要介绍了基于Springboot+Netty实现rpc功能,在父项目中引入相关依赖结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2022-02-02
详解Spring Security的formLogin登录认证模式
对于一个完整的应用系统,与登录验证相关的页面都是高度定制化的,非常美观而且提供多种登录方式。这就需要Spring Security支持我们自己定制登录页面,也就是本文给大家介绍的formLogin模式登录认证模式,感兴趣的朋友跟随小编一起看看吧2019-11-11
idea maven编译报错Java heap space的解决方法
这篇文章主要为大家详细介绍了idea maven编译报错Java heap space的相关解决方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下2025-04-04


最新评论