返回顶部
首页 > 资讯 > 精选 >SpringBoot怎么自定义路由覆盖
  • 450
分享到

SpringBoot怎么自定义路由覆盖

2023-07-04 21:07:05 450人浏览 薄情痞子
摘要

这篇文章主要介绍“SpringBoot怎么自定义路由覆盖”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springBoot怎么自定义路由覆盖”文章能帮助大家解决问题。背景公司最近有一个项目二期需要对

这篇文章主要介绍“SpringBoot怎么自定义路由覆盖”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“springBoot怎么自定义路由覆盖”文章能帮助大家解决问题。

    背景

    公司最近有一个项目二期需要对一些功能进行改造,涉及部分框架内置业务接口个性化定制,兼容老接口功能并且增加一部分新的数据返回,由于前端调用这些接口分布较多且较为零碎,修改测试成本较大,所以打算在框架层面提供路由覆盖功能,加快项目进度减少无技术含量的修改带来的系统风险

    设计

    • 提供自定义注解指定需要覆盖的路由及新路由地址

    • 系统启动时扫描所有注解数据并进行映射处理

    • 注册自定义路由映射配置类

    实现

    注解定义

    @Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Inheritedpublic @interface CoverRoute {    String value() default "";}

    注解扫描及管理

    在系统启动时调用initRoute方法,把原路由和对应的覆盖路由映射到map键值对中

    public class ConverRouteUtil {    private static HashMap<String, String> mappingReGISt = new HashMap<>();    public static void initRoute(Class runtimeClass, List<String> extraPackageNameList) {        List<Class<?>> scanClassList = new ArrayList<>();        if (!runtimeClass.getPackage().getName().equals(Application.class.getPackage().getName())) {            scanClassList.addAll(ScanUtil.getAllClassByPackageName_Annotation(runtimeClass.getPackage(), CoverRoute.class));        }        for (String packageName : extraPackageNameList) {            scanClassList.addAll(ScanUtil.getAllClassByPackageName_Annotation(packageName, CoverRoute.class));        }        for (Class clazz : scanClassList) {            CoverRoute coverRoute = (CoverRoute) clazz.getAnnotation(CoverRoute.class);            if (StringUtil.isEmpty(coverRoute.value())) {                continue;            }            RequestMapping requestMapping = (RequestMapping) clazz.getAnnotation(RequestMapping.class);            String classRoute = "";            if (requestMapping != null) {                classRoute = requestMapping.value()[0];            } else {                continue;            }            List<Method> methodList = Arrays.asList(clazz.getDeclaredMethods());            for (Method method : methodList) {                PostMapping postMapping = method.getAnnotation(PostMapping.class);                String methodRoute = "";                if (postMapping != null) {                    methodRoute = postMapping.value()[0];                } else {                    GetMapping getMapping = method.getAnnotation(GetMapping.class);                    if (getMapping != null) {                        methodRoute = getMapping.value()[0];                    }                }                if (!StringUtil.isEmpty(classRoute) && !StringUtil.isEmpty(methodRoute)) {                    String orginalRoute = coverRoute.value() + methodRoute;                    String redirectRoute = classRoute + methodRoute;                    mappingRegist.put(orginalRoute, redirectRoute);                }            }        }        if (mappingRegist.size() > 0) {            System.out.println("扫描路由方法覆盖:" + mappingRegist.size() + "个");        }    }    public static boolean checkExistCover(String orginalRoute) {        return mappingRegist.containsKey(orginalRoute);    }    public static String getRedirectRoute(String orginalRoute) {        return mappingRegist.get(orginalRoute);    }}

    自定义RequestMappingHandlerMapping

    继承RequestMappingHandlerMapping重写lookupHandlerMethod方法,在spring进行路由寻址时进行覆盖

    public class CustomRequestMappingHandlerMapping extends RequestMappingHandlerMapping {    @Override    protected HandlerMethod lookupHandlerMethod(String lookupPath, httpservletRequest request) throws Exception {        if(ConverRouteUtil.checkExistCover(lookupPath)){            String redirectRoute = ConverRouteUtil.getRedirectRoute(lookupPath);            request.setAttribute("redirectTag","1");            request.setAttribute("redirectRoute",redirectRoute);            request.setAttribute("lookupPath",lookupPath);            lookupPath = redirectRoute;        }else{            request.setAttribute("redirectTag","0");        }        return super.lookupHandlerMethod(lookupPath, request);    }    @Override    protected RequestMappingInfo getMatchingMapping(RequestMappingInfo info, HttpServletRequest request) {        String redirectTag = ConvertOp.convert2String(request.getAttribute("redirectTag"));        if(redirectTag.equals("1")){            String redirectRoute = ConvertOp.convert2String(request.getAttribute("redirectRoute"));            boolean check = false;            if( info.getPatternsCondition()!=null){                Set<String> set =  info.getPatternsCondition().getPatterns();                if(set.size()>0){                    String[] array = new String[set.size()];                    array = set.toArray(array);                    String pattern = array[0];                    if(pattern.equals(redirectRoute)){                        check = true;                    }                }            }            if(check){                return info;            }else{                return super.getMatchingMapping(info, request);            }        }else{            return super.getMatchingMapping(info, request);        }    }}

    注册RequestMappingHandlerMapping

    @Componentpublic class WEBRequestMappinGConfig implements WebmvcRegistrations {    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {        RequestMappingHandlerMapping handlerMapping = new CustomRequestMappingHandlerMapping();        handlerMapping.setOrder(0);        return handlerMapping;    }}

    使用示例

    在个性化接口类增加@CoverRoute注解,指定需要覆盖的路由地址,创建相同路由路径的的方法即可,访问原来的接口地址会自动转发到项目个性化接口地址

    原接口

    @Controller@RequestMapping("/example/original")public class RedirectOriginalExampleController {    @PostMapping("/getConfig")    @ResponseBody    @AnonymousAccess    public Object getConfig(@RequestBody Map<String, Object> params) {        Result result = Result.okResult();        result.add("tag","original");        return result;    }}

    新接口

    @Controller@RequestMapping("/example/redirect")@CoverRoute("/example/original")public class RedirectExampleController {    @PostMapping("/getConfig")    @ResponseBody    public Object getConfig(@RequestBody Map<String, Object> params) {        Result result = Result.okResult();        String param1 = ConvertOp.convert2String(params.get("param1"));        result.add("tag","redirect");        result.add("param1",param1);        return result;    }}

    关于“SpringBoot怎么自定义路由覆盖”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网精选频道,小编每天都会为大家更新不同的知识点。

    --结束END--

    本文标题: SpringBoot怎么自定义路由覆盖

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

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

    猜你喜欢
    • SpringBoot怎么自定义路由覆盖
      这篇文章主要介绍“SpringBoot怎么自定义路由覆盖”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot怎么自定义路由覆盖”文章能帮助大家解决问题。背景公司最近有一个项目二期需要对...
      99+
      2023-07-04
    • SpringBoot自定义路由覆盖实现流程详解
      目录背景设计实现注解定义注解扫描及管理自定义RequestMappingHandlerMapping注册RequestMappingHandlerMapping使用示例背景 公司最近...
      99+
      2023-01-02
      SpringBoot自定义路由覆盖 SpringBoot路由覆盖
    • js怎么实现自定义路由
      这篇文章主要为大家展示了“js怎么实现自定义路由”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“js怎么实现自定义路由”这篇文章吧。本文实现自定义路由,主要是事件...
      99+
      2024-04-02
    • PHP中怎么使用自定义路由
      这篇文章将为大家详细讲解有关PHP中怎么使用自定义路由,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体实现:我在网站文件夹目录中新增了一个”API”文件夹,在里面新建一个.htaccess...
      99+
      2023-06-17
    • Android自定义覆盖层控件 悬浮窗控件
      在我们移动应用开发过程中,偶尔有可能会接到这种需求: 1、在手机桌面创建一个窗口,类似于360的悬浮窗口,点击这个窗口可以响应(至于窗口拖动我们可以后面再扩展)。 2、自己...
      99+
      2022-06-06
      Android
    • WPF自定义路由事件
      与依赖项属性类似,WPF也为路由事件提供了WPF事件系统这一组成。为一个类型添加一个路由事件的方式与为类型添加依赖项属性的方法类似,添加一个自定义路由事件的步骤: 一、声明路由事件变...
      99+
      2024-04-02
    • VantUI怎么封装自定义Tabbar路由跳转
      本篇内容介绍了“VantUI怎么封装自定义Tabbar路由跳转”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!效果如下:在src目录下新建个c...
      99+
      2023-06-30
    • SpringBoot怎么自定义Starter
      这篇文章给大家分享的是有关SpringBoot怎么自定义Starter的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是StarterStarter是Spring Boot中的一个非常重要的概念,Starter...
      99+
      2023-06-22
    • Django实现自定义路由转换器
      自定义路径转换器 有时候上面的内置的url转换器并不能满足我们的需求,因此django给我们提供了一个接口可以让我们自己定义自己的url转换器 django内置的路径转换器源码解...
      99+
      2024-04-02
    • Flutter之自定义路由切换动画
      Flutter之自定义路由切换动画 在Flutter中,我们可以通过Navigator来实现路由管理,包括路由的跳转和返回等。默认情况下,Flutter提供了一些简单的路由切换动画,但是有时候我们需要...
      99+
      2023-09-21
      flutter android 动画 职场和发展 学习 经验分享
    • Node.js自定义实现文件路由功能
      一、创建路由处理定义 //获取http模块 var http = require('http'); //文件 模块 var fs = require('fs'); //404文件 var e...
      99+
      2022-06-04
      自定义 文件 路由功能
    • Think PHP中实现自定义路由规则
      《Think PHP中实现自定义路由规则,需要具体代码示例》 在使用Think PHP框架进行开发时,经常会碰到需要自定义路由规则的情况。默认情况下,Think PHP会根据URL中的...
      99+
      2024-04-02
    • WPF自定义路由事件的实例教程
      目录路由事件模型【分析代码】【自定义路由事件】总结路由事件模型 传统的简单事件模型中,在消息激发是将消息通过事件订阅的然后交给事件的相应者,事件的相应者使用事件的处理器来做出相应,这...
      99+
      2024-04-02
    • WPF自定义路由事件的示例分析
      这篇文章主要为大家展示了“WPF自定义路由事件的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“WPF自定义路由事件的示例分析”这篇文章吧。一、声明路由事件变量并注册定义只读的静态变量字段...
      99+
      2023-06-29
    • 详解Android Flutter如何自定义动画路由
      目录简介自定义跳转使用flutter动画基础实现一个自定义的route总结简介 flutter中有默认的Route组件,叫做MaterialPageRoute,一般情况下我们在flu...
      99+
      2023-05-16
      Android Flutter自定义动画路由 Flutter自定义动画路由 Android Flutter 动画
    • 精通MVC3摘译(3)-自定义路由系统
      路由系统非常灵活,但是如果这还不能满足你的 需求,那么,你可以定制路由系统。 创建基于RouteBase 的接口 如果你不喜欢标准路由对象匹配URL的方式,或者你想实现一些特殊的接口,你可以从RouteBase中继承一个类。让你可以控制UR...
      99+
      2023-01-31
      摘译 自定义 路由
    • 怎么在php中利用Laravel定义路由
      本篇文章为大家展示了怎么在php中利用Laravel定义路由,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主...
      99+
      2023-06-14
    • SpringBoot自定义/error路径失效的解决
      目录SpringBoot自定义/error路径失效背景配置信息解决思路SpringBoot的/error的自定义处理它的具体定义如下他有三个方法SpringBoot自定义/error...
      99+
      2024-04-02
    • React Native自定义路由管理的深入理解
      目录1、自定义路由2、Tab导航3、数据回传总结1、自定义路由 众所周知,不管是在原生Android还是iOS,它们都有一个默认的路由路由栈管理类。由于React Native官方...
      99+
      2024-04-02
    • 解决SpringCloud Gateway配置自定义路由404的坑
      目录问题背景问题现象解决过程1 检查网关配置2 跟源码,查找可能的原因3 异常原因分析解决方法心得问题背景 将原有项目中的websocket模块迁移到基于SpringCloud Al...
      99+
      2024-04-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作