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

 更新时间:2021年11月19日 14:50:56   作者:三毛村滴雪鱼粉  
这篇文章主要介绍了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,代码的可读性不是太好。

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

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

相关文章

  • Spring JPA联表查询之注解属性详解

    Spring JPA联表查询之注解属性详解

    这篇文章主要为大家介绍了Spring JPA联表查询之注解属性示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java代码块与代码加载顺序原理详解

    Java代码块与代码加载顺序原理详解

    这篇文章主要介绍了Java代码块与代码加载顺序原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • JDK的Parser来解析Java源代码详解

    JDK的Parser来解析Java源代码详解

    这篇文章主要介绍了JDK的Parser来解析Java源代码的相关资料,需要的朋友可以参考下
    2016-09-09
  • Spring强大事务兼容数据库多种组合解决业务需求

    Spring强大事务兼容数据库多种组合解决业务需求

    这篇文章主要为大家介绍了Spring强大事务兼容数据库多种组合解决业务需求示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • mybaits-plus lambdaQuery() 和 lambdaUpdate() 常见的使用方法

    mybaits-plus lambdaQuery() 和 lambdaUpdate() 常见的使用方法

    MyBatis-Plus是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生,这篇文章主要介绍了mybaits-plus lambdaQuery() 和 lambdaUpdate() 比较常见的使用方法,需要的朋友可以参考下
    2023-01-01
  • java异步方式实现登录

    java异步方式实现登录

    这篇文章主要为大家详细介绍了java异步方式实现登录的相关资料,感兴趣的朋友可以参考一下
    2016-05-05
  • Servlet连接数据库实现用户登录的实现示例

    Servlet连接数据库实现用户登录的实现示例

    本文主要介绍了Servlet连接数据库实现用户登录的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • Java Scoket实现双向通信代码详解

    Java Scoket实现双向通信代码详解

    这篇文章主要介绍了Java Scoket实现双向通信代码详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • Java的springcloud Sentinel是什么你知道吗

    Java的springcloud Sentinel是什么你知道吗

    这篇文章主要介绍了Java之springcloud Sentinel案例讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java方法重载的使用实战案例

    Java方法重载的使用实战案例

    这篇文章主要介绍了Java方法重载的使用,结合具体实例形式分析了java方法重载的基本使用技巧与相关操作注意事项,需要的朋友可以参考下
    2019-09-09

最新评论