Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency.

news2025/1/23 13:12:12

一、问题

在启动springcloud的gateway模块的时候报错Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency.

二、问题产生的原因

gateway组件中的 spring-boot-starter-webflux 和 springboot作为web项目启动必不可少的 spring-boot-starter-web 出现冲突。

三、解决方案(任选一种就可以)

3.1 注释pom.xml内容

在gateway的pom文件上注释掉spring-boot-starter-web代码

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

3.2修改配置文件

在配置文件上加上

spring:
    main:
        web-application-type: reactive

解释:这里面涉及到springboot的启动流程因为spring-boot-starter-webflux包,在springboot启动类型里面表示的就是reactive。我们可以看源码,了解一下springboot启动流程

一步一步点进去

这是springApplication构造方法,我们先看构造方法

点进去

3.2.1通过springboot源码解释

springApplication构造源码(不同版本会有差异,当前版本是2.6.1)

public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
        
        this.sources = new LinkedHashSet();
        // 在控制台打印banner.txt文本内容
        this.bannerMode = Mode.CONSOLE;
        this.logStartupInfo = true;
        this.addCommandLineProperties = true;
        this.addConversionService = true;
        this.headless = true;
        this.registerShutdownHook = true;
        this.additionalProfiles = Collections.emptySet();
        this.isCustomEnvironment = false;
        this.lazyInitialization = false;
        this.applicationContextFactory = ApplicationContextFactory.DEFAULT;
        this.applicationStartup = ApplicationStartup.DEFAULT;
        // 开始输resourceLoader注入了属性null
        this.resourceLoader = resourceLoader;
        Assert.notNull(primarySources, "PrimarySources must not be null");
        //将启动类从数组重新封装Set,注入到primarySources当中
        this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
        /**
          *webApplicationType有三种类型,REACTIVE,SERVLET,NONE
          *  引入spring-boot-starter-web就是SERVLET
          *  引入spring-boot-starter-webflux就是REACTIVE
          *  没有就是NONE
          */
        this.webApplicationType = WebApplicationType.deduceFromClasspath();
        /**
          *从spring-cloud-context的jar包的META-INF/spring.factories文件中得到key为org.springfra           *mework.boot.BootstrapRegistryInitializer的全类名集合,进行实例化,然后注入 bootstrapRegi
          *stryInitializers 属性,其中核心方法getSpringFactoriesInstances
          *下面有getSpringFactoriesInstances方法源码详解
          *这里简单的解释一下getSpringFactoriesInstances方法就是从META-INF/spring.factories读取配
          *置文件            
          */
        this.bootstrapRegistryInitializers = new ArrayList(this.getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
        /**
          *依然调用getSpringFactoriesInstances方法
          *从spring-boot的jar包的META-INF/spring.factories文件中得到key为org.springframework.            *context.ApplicationContextInitializer的全类名集合,然后进行实例化,然后注入initializers
          *(初始化容器集合)属性  
          */
        this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
        //跟上面一样,这里是得到监听器的集合,并注入
        this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
        //获取当前的main方法运行的类,也就是我们的主类
        this.mainApplicationClass = this.deduceMainApplicationClass();
    }

上面说的META-INF/spring.factories都是在springboot.jar包中,不过BootstrapRegistryInitializer是在spring-cloud-context中。

3.2.2了解getSpringFactoriesInstances方法

随便选一个点进去

  private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
        ClassLoader classLoader = this.getClassLoader();
        /** SpringFactoriesLoader.loadFactoryNames(type, classLoader)这里才是核心,
          *这个方法会扫描所有jar包类路径下 META-INF/spring.factories
          */
        Set<String> names = new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
        List<T> instances = this.createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);
        AnnotationAwareOrderComparator.sort(instances);
        return instances;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端如何将静态页面部署到服务器,并可以通过公网ip访问。

问题描述 作为卑微的前端页面仔。在我们公司项目上线的时候&#xff0c;一般都是我们前端 npm run build&#xff0c;然后直接把打出来的dist包丢给后端&#xff0c;后端上传到服务器完成前端的部署。这个时候我就很好奇&#xff0c;页面是怎么上传到服务器的呢&#xff1f;上…

vue使用pinia (vue2/vue3)

pinia是什么&#xff1f;Pinia 是 Vue.js 的轻量级状态管理库 官方网站&#xff1a;Pinia 中文文档: 介绍 | Pinia 中文文档 pinia与vuex4 相同 是vue 官方 状态管理工具(作者是 Vue 核心团队成员&#xff09;是vue开发者工具支持pinia 不同 pinia相比vuex4&#xff0c…

云E办Springboot+vue——前端项目完整版(含源码)

一、项目简介 项目背景&#xff1a;受疫情的影响&#xff0c;许多企业由线上办公转为线下办公。随着线上办公的人数的增多&#xff0c;线上办公的优点逐步凸显&#xff1a;通过实现工作流程的自动化、节省企业办公费用、实现绿色办公&#xff0c;同时提升办公效率。 项目介绍…

uniapp在小程序中登录,获取用户信息,获取手机号逻辑记录

这里写目录标题概述uniapp小程序的授权描述授权的详细说明及使用1、微信小程序通过uni.login()方法可以获取到微信提供的code2、通过登录获取的code码可以以获取用户唯一标识openid以及会话密钥sessionkey用于解密获取手机的加密信息3、通过微信提供的获取微信手机号的方法getp…

ELK企业级日志分析平台(二)

文章目录一、kibana数据可视化1.部署2.定制数据可视化&#xff08;1&#xff09;网站访问量&#xff08;2&#xff09;访问量排行榜&#xff08;3&#xff09;创建dashboard&#xff0c;大屏展示二、ES集群监控1.启用xpack认证2.metricbeat监控3.filebeat日志采集一、kibana数据…

【玩转CSS】一文带你了解浮动

&#x1f525;一个人走得远了&#xff0c;就会忘记自己为了什么而出发&#xff0c;希望你可以不忘初心&#xff0c;不要随波逐流&#xff0c;一直走下去&#x1f3b6; &#x1f98b; 欢迎关注&#x1f5b1;点赞&#x1f44d;收藏&#x1f31f;留言&#x1f43e; &#x1f984; …

牛客前端刷题(六)—— JS基础

还在担心面试不通过吗?给大家推荐一个超级好用的刷面试题神器:牛客网,里面涵盖了各个领域的面试题库,还有大厂真题哦! 赶快悄悄的努力起来吧,不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享,感觉有用的小伙伴可以点个订阅,不定时更新相关面试题:面试专栏…

前端面试中经常提到的LRU缓存策略详解

&#x1f431; 个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️ 作者简介&#xff1a;2022年度博客之星前端领域TOP 2&#xff0c;前端领域优质作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &am…

微信小程序解决view点击事件穿透地图map触发markertap

微信小程序中使用map组件&#xff0c;ios手机中点击地图上的view&#xff0c;会触发底下的markertap&#xff0c;只要底下如果有marker点的话。 这就造成了用户体验不是很好。 然后无意间我发现点击能滑动的scroll-view反而不会触发底下的markertap&#xff0c;就等于是一个不…

HTML介绍以及常用代码

HTML 网页基础 html(Hyper Text Markup Language)超文本标 记语言&#xff0c;发明者: Tim Berners-leehtml主要是定义网页内容和结构的。html是编 写网页的语言。html只能运行在浏览器上面网页的技术包含: html(编写网页结构&#xff0c;类似人 的骨架)&#xff0c;css(层叠…

前端启动项目npm run dev报错npm ERR! missing script: dev

今天遇到了这样一个nt问题 突然前端跑不起来后面发现是进行npm run dev 命令的时候少进入一层目录 进去之后就可以了对此遇到这个bug我还查了很多blog 发现还有以下两种原因1.打开的是当前文件夹&#xff0c;但是文件夹package.js里的scripts确实没有dev,输入vue init webpack …

【node进阶】深入浅出前后端身份验证(下)---JWT

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

【JavaScript】JS实用案例分享:选择器组件 | 简易计算器

&#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&#xff0c;任重道远&#xff08;来自大三学长的万字自述&#xff09; &#x1f5a5;️ TypeScript知识总结&…

Axure RP9使用指南

1、快捷键 选中图层移动到上一层 ctrl [ 选中图层移动到下一层 ctrl ] 选中图层移动到顶层 ctrl shift [ 选中图层移动到底层 ctrl shift ] 合并为一组 ctrl G 取消合并 ctrl shift G 锁定位置和尺寸 ctrl K 解锁 ctrl shift K 拖动页面可以按住空格再通过鼠标拖动…

CSS实现文字颜色渐变

三行代码即可实现&#xff1a; background: linear-gradient(to bottom, #ffff, #f8fdff, #acf5ff, #67eeff, #24d8ff);-webkit-background-clip: text;color: transparent; 一 先设置背景颜色渐变 background 渐变属性可选值&#xff1a; 1 linear-gradient 为线性渐变…

JavaScript的节点操作 —— 增加节点

目录 JavaScript中的节点操作分为&#xff1a;增、删、改、查&#xff08;获取&#xff09;&#xff0c;四大类型。 我们直接利用案例来学习&#xff1a; HTML布局代码&#xff1a; JavaScript代码实现&#xff1a; 第一步&#xff1a;获取所有要用到的元素对象&#xff…

Vue3中toRef以及toRefs的基本使用

toRef以及toRefs 作用:创建一个ref对象&#xff0c;其value值指向另一个对象中的某个属性。 语法&#xff1a;const name toRef(obj,name) 应用&#xff1a;要将响应式对象中的某个属性单独提供给外部使用时 拓展:toRefs与toRef功能一致&#xff0c;但可以批量创建多个ref对…

vue报错 Error in render: “TypeError: Cannot read properties of undefined (reading ‘nickname‘)“

起因&#xff1a;我用axios请求数据&#xff08;可以看见数据了&#xff0c;已经请求成功的&#xff09;&#xff0c;最后加载在模板上&#xff08;页面模板上有内容&#xff09;&#xff0c;但是控制台出现了一个奇怪的错误 在created()钩子函数请求接口并报错数据&#xff0…

css 如何实现文本竖排、横排展示

writing-mode 该属性定义了文本在水平或垂直方向上如何排布 writing-mode:horizontal-tb | vertical-rl | vertical-lr | sideways-rl | sideways-lr接下来和我一起看看各个属性值的用法吧&#xff01;Go! <style>.root {border: 1px solid green;width: 400px;height: 4…

Vue内置组件的component标签

component标签&#xff1a;它的用途是可以动态绑定我们的组件,根据数据不同更换不同的组件. 有一个is属性&#xff0c;is的作用就是显示指定的组件 官方说明&#xff1a;渲染一个“元组件”为动态组件。依 is 的值&#xff0c;来决定哪个组件被渲染 使用方式也很简单&#xf…