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

这篇具有很好参考价值的文章主要介绍了Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency.。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、问题

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

please set spring.main.web-application-type=reactive or remove spring-boot-s,springcloud,spring,java,spring boot,Powered by 金山文档

二、问题产生的原因

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启动流程

一步一步点进去

please set spring.main.web-application-type=reactive or remove spring-boot-s,springcloud,spring,java,spring boot,Powered by 金山文档
please set spring.main.web-application-type=reactive or remove spring-boot-s,springcloud,spring,java,spring boot,Powered by 金山文档

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

please set spring.main.web-application-type=reactive or remove spring-boot-s,springcloud,spring,java,spring boot,Powered by 金山文档

点进去

please set spring.main.web-application-type=reactive or remove spring-boot-s,springcloud,spring,java,spring boot,Powered by 金山文档

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方法

随便选一个点进去文章来源地址https://www.toymoban.com/news/detail-793869.html

please set spring.main.web-application-type=reactive or remove spring-boot-s,springcloud,spring,java,spring boot,Powered by 金山文档
please set spring.main.web-application-type=reactive or remove spring-boot-s,springcloud,spring,java,spring boot,Powered by 金山文档
  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;
    }

到了这里,关于Please set spring.main.web-application-type=reactive or remove spring-boot-starter-web dependency.的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包