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,代码的可读性不是太好。

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

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

相关文章

  • 一文解开java中字符串编码的小秘密(干货)

    一文解开java中字符串编码的小秘密(干货)

    这篇文章主要介绍了一文解开java中字符串编码的小秘密(干货),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 基于Java实现空间滤波完整代码

    基于Java实现空间滤波完整代码

    空间滤波是一种采用滤波处理的影像增强方法。其理论基础是空间卷积和空间相关。这篇文章主要介绍了基于Java的空间滤波代码实现,需要的朋友可以参考下
    2021-08-08
  • SpringBoot跨域Jsonp和Cors的方法

    SpringBoot跨域Jsonp和Cors的方法

    这篇文章主要介绍了SpringBoot跨域Jsonp和Cors的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • java8新特性-Stream入门学习心得

    java8新特性-Stream入门学习心得

    这篇文章主要介绍了java8新特性-Stream入门学习心得,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 解析Java中未被捕获的异常以及try语句的嵌套使用

    解析Java中未被捕获的异常以及try语句的嵌套使用

    这篇文章主要介绍了Java中未被捕获的异常以及try语句的嵌套使用,是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • java http请求设置代理Proxy的两种常见方法

    java http请求设置代理Proxy的两种常见方法

    代理是一种常见的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问,这篇文章主要给大家介绍了关于java http请求设置代理Proxy的两种常见方法,需要的朋友可以参考下
    2023-11-11
  • Json转换工具类

    Json转换工具类

    今天小编就为大家分享一篇关于Json转换工具类,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • Java组件javabean用户登录实例详解

    Java组件javabean用户登录实例详解

    这篇文章主要为大家详细介绍了Java组件javabean用户登录实例,内容有用户登录,注册和退出等,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • selenium+java环境搭建过程推荐

    selenium+java环境搭建过程推荐

    这篇文章主要介绍了selenium+java环境搭建过程推荐,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • @JsonSerialize序列化注解的使用

    @JsonSerialize序列化注解的使用

    这篇文章主要介绍了@JsonSerialize序列化注解的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08

最新评论