iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringBoot根据目录结构自动配置Url前缀方式
  • 107
分享到

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

2024-04-02 19:04:59 107人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录自定义RequestMappingInfo通过接口的形式发现类在很多其他框架中,比如python的flask、node.js的KOA,Controller要想能够响应前端的请求都

在很多其他框架中,比如pythonflasknode.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,代码的可读性不是太好。

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: SpringBoot根据目录结构自动配置Url前缀方式

本文链接: https://www.lsjlt.com/news/157807.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot根据目录结构自动配置Url前缀方式
    目录自定义RequestMappingInfo通过接口的形式发现类在很多其他框架中,比如Python的Flask、node.js的KOA,Controller要想能够响应前端的请求都...
    99+
    2022-11-12
  • SpringBoot如何根据目录结构自动配置Url前缀
    这篇文章主要为大家展示了“SpringBoot如何根据目录结构自动配置Url前缀”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot如何根据目录结构自动配置Url前缀”这篇文章吧。...
    99+
    2023-06-25
  • SpringBoot根据目录结构自动生成路由前缀的实现代码
    目录前言具体实现配置文件指定基础包自动补全路由前缀处理类自动补全路由前缀配置类测试类测试前言 本文介绍如何根据目录结构给RequestMapping添加路由前缀(覆盖RequestM...
    99+
    2022-11-12
  • SpringBoot如何根据目录结构生成API接口前缀
    目录一、根据目录结构生成接口前缀二、自定义RequestMappingInfo三、测试一、根据目录结构生成接口前缀 在写api的接口时,通常有很多版本的迭代,比如:v1、v2。 如图...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作