解决springboot服务启动报错:Unable to start embedded contain

目录
  • 1. 根据报错信息发现是在刷新容器的方法onRefresh中抛出的
  • 2. 接着被捕获异常的方法源码
  • 3. 再接着就是抛出异常的根源所在的源码
  • 4. 知道原因了反过去查看代码发现启动类中少写了注解
  • 5. 还有一种情况需要注意

初次接触spring-boot + spring-cloud构建微服务项目,配置好项目后并选择启动类启动时报如下错误:

[main] ERROR org.springframework.boot.SpringApplication - Application startup failed
org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:137)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:536)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:314)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1162)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1151)
    at com.dispatchCenter.main.DispatchCenterApplication.main(DispatchCenterApplication.java:9)
Caused by: org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.getEmbeddedServletContainerFactory(EmbeddedWebApplicationContext.java:189)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:162)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:134)
    ... 8 common frames omitted

1. 根据报错信息发现是在刷新容器的方法onRefresh中抛出的

为什么是刷新容器的方法呢?相信大家都知道spring-boot是基于spring的扩展,是简化spring配置的一个工具,

至于spring是怎么初始化的在本篇不做概述。我们在这只需要知道

EmbeddedWebApplicationContext extends org.springframework.web.context.support.GenericWebApplicationContext

下面点进去查看EmbeddedWebApplicationContext此类中刷新容器的方法的源码如下:

    protected void onRefresh() {
        super.onRefresh();  --这里就是刷新spring容器的入口
 
        try {
            this.createEmbeddedServletContainer();   --捕获的是这个方法中的异常
        } catch (Throwable var2) {
            throw new ApplicationContextException("Unable to start embedded container", var2); --这里捕获异常后抛出
        }
    }

2. 接着被捕获异常的方法源码

private void createEmbeddedServletContainer() {
        EmbeddedServletContainer localContainer = this.embeddedServletContainer;
        ServletContext localServletContext = this.getServletContext();
        if (localContainer == null && localServletContext == null) {
            EmbeddedServletContainerFactory containerFactory = this.getEmbeddedServletContainerFactory();  --根据报错信息这里抛出的异常
            this.embeddedServletContainer = containerFactory.getEmbeddedServletContainer(new ServletContextInitializer[]{this.getSelfInitializer()});
        } else if (localServletContext != null) {
            try {
                this.getSelfInitializer().onStartup(localServletContext);
            } catch (ServletException var4) {
                throw new ApplicationContextException("Cannot initialize servlet context", var4);
            }
        }
 
        this.initPropertySources();
    }

3. 再接着就是抛出异常的根源所在的源码

通过查看源码得出是启动时从beanFactory中找不到所需bean的存在,也就是bean根本没有注册:

protected EmbeddedServletContainerFactory getEmbeddedServletContainerFactory() {
        String[] beanNames = this.getBeanFactory().getBeanNamesForType(EmbeddedServletContainerFactory.class); --这里通过类型去查询bean,结果发现一个都没有就抛出异常了,当然如果超过一个也会抛出异常
        if (beanNames.length == 0) {
            throw new ApplicationContextException("Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.");
        } else if (beanNames.length > 1) {
            throw new ApplicationContextException("Unable to start EmbeddedWebApplicationContext due to multiple EmbeddedServletContainerFactory beans : " + StringUtils.arrayToCommaDelimitedString(beanNames));
        } else {
            return (EmbeddedServletContainerFactory)this.getBeanFactory().getBean(beanNames[0], EmbeddedServletContainerFactory.class);
        }
    }

4. 知道原因了反过去查看代码发现启动类中少写了注解

太粗心大意了

@EnableEurekaServer
@SpringBootApplication

5. 还有一种情况需要注意

我们使用注解标注了这个启动类,但是还是提示Cannot resolve symbol *等问题,一定要去检查引包是否正确

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

(0)

相关推荐

  • 解决springboot启动失败的问题('hibernate.dialect' not set)

    目录 springboot启动失败的问题 启动springboot报错如下 将Hibernate SQL方言整理如下表 springboot出现'hibernate.dialect'not set springboot启动失败的问题 springboot版本是1.3.0.M1,连接的mysql版本为8,用spring-boot-starter-data-jpa操做数据库 启动springboot报错如下 2018-02-21 11:25:47.637 WARN 12992 --- [ main]

  • SpringBoot接口路径重复,启动服务器失败的解决

    目录 SpringBoot接口路径重复,启动服务器失败 问题 原因 解决方法 启动服务器失败报错 spring-boot Failed to start component [StandardServer[-1]] 问题 解决办法 SpringBoot接口路径重复,启动服务器失败 问题 WARN [localhost-startStop-1] o.a.c.loader.WebappClassLoaderBase:180- The web application [ROOT] appears to

  • Spring Boot 项目启动失败的解决方案

    Spring Boot 项目是不是经常失败,显示一大堆的错误信息,如端口重复绑定时会打印以下异常: *************************** APPLICATION FAILED TO START *************************** Description: Embedded servlet container failed to start. Port 8080 was already in use. Action: Identify and stop the

  • Springboot项目因为kackson版本问题启动报错解决方案

    问题现象 org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.boot.context.embedded.EmbeddedServletContainerException: Unable to start embedded Tomcat     at org.springframew

  • 解决springboot服务启动报错:Unable to start embedded contain

    目录 1. 根据报错信息发现是在刷新容器的方法onRefresh中抛出的 2. 接着被捕获异常的方法源码 3. 再接着就是抛出异常的根源所在的源码 4. 知道原因了反过去查看代码发现启动类中少写了注解 5. 还有一种情况需要注意 初次接触spring-boot + spring-cloud构建微服务项目,配置好项目后并选择启动类启动时报如下错误: [main] ERROR org.springframework.boot.SpringApplication - Application start

  • springcloud gateway网关服务启动报错的解决

    目录 gateway网关服务启动报错 集成gateway 报错 原因分析 gateway网关运行时报错问题(版本问题) 父级中的版本问题 原因:父项目中的jdk版本问题 解决方法 gateway网关服务启动报错 集成gateway springcloud网关集成gateway服务 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter

  • 解决python运行启动报错问题

    问题一: python启动报错api-ms-win-crt-process-l1-1-0.dll 丢失 解决: 下载api-ms-win-crt-process-l1-1-0.dll文件丢到C:\Windows\SysWOW64(64位操作系统).C:\Windows\System32(32位操作系统)目录下 问题二: python运行时错误代码(0xc000007b) 解决: 下载directxrepair工具修复系统文件,修复成功后手动重启电脑 补充知识:Python3开启自带http服务

  • 解决SpringBoot中@Email报错问题

    JSR303校验相关 现象:在springboot中使用@Email注解进行数据校验时,报没有该注解的错误. 解决方法: 在pom.xml中加该配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 测试成功 ==测试成功== ![i

  • 解决springboot+activemq启动报注解错误的问题

    springboot+activemq启动报注解错误 Description: Field jmsMessagingTemplate in com.haozz.demo.mq.PromoteActProducer required a bean of type 'org.springframework.jms.core.JmsMessagingTemplate' that could not be found. The injection point has the following anno

  • 解决SpringBoot webSocket 资源无法加载、tomcat启动报错的问题

    问题描述: 1. 项目集成WebSocket,且打包发布tomcat时出现websocket is already in CLOSING or CLOSE state这样的问题,建议参考"解决方法二",但是"解决方法一"请要了解查看 ,因为解决方法二是在一的基础上进行更正 2. 如果出现javax.websocket.server.ServerContainer not available这样的错误,请参考"解决方法一"中步骤3 解决方法一:(常

  • 解决springboot整合cxf启动报错,原因是版本问题

    springboot整合cxf启动报错 错误信息如下 [DEBUG] 2021-01-26 11:28:47,848 [main] org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - Application failed to start due to an exception org.springframework.beans.factory.NoSuchBeanDefinitionException: N

  • 解决springboot项目不配置数据源启动报错问题

    目录 springboot项目不配置数据源启动报错 springboot配置双数据源报错 springboot项目不配置数据源启动报错 spring boot默认会加载 org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration 在启动类上加上 @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoCo

  • 解决SpringBoot运行Test时报错:SpringBoot Unable to find

    目录 SpringBoot运行Test时报错 错误详情 解决办法 SpringBootTest单元测试报错 SpringBoot运行Test时报错 运行Test时的报错信息:SpringBoot Unable to find a @SpringBootConfiguration 错误详情 今天做SpringBoot配置邮件发送的时候,运行测试类,报如下错误: 说找不到@SpringBootConfiguration注解,其实是有的,检查了下启动类和被测试类的细节,都没问题,查询的很多CSDN答案

随机推荐