线程“主”org.springframework.context.ApplicationContextException 中的异常:无法启动嵌入式容器;
Posted
技术标签:
【中文标题】线程“主”org.springframework.context.ApplicationContextException 中的异常:无法启动嵌入式容器;【英文标题】:Exception in thread "main" org.springframework.context.ApplicationContextException: Unable to start embedded container; 【发布时间】:2016-09-03 23:43:15 【问题描述】:我在运行 spring 应用程序时遇到此错误:
Exception in thread "main" 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:124)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:476)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:320)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:952)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:941)
at com.dh.test.Application.main(Application.java:13)
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:174)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:147)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:121)
... 7 more
我的主类看起来像:
@Configuration
@ComponentScan
public class Application
public static void main(String[] args)
SpringApplication.run(Application.class, args);
我正在尝试使用@Bean通过java类配置spring的属性:
@Configuration
@EnableJpaRepositories(
entityManagerFactoryRef = "customerEntityManager",
transactionManagerRef = "customerTransactionManager",
basePackages = "com.dh.test.repository.customer")
public class CustomerDbConfig
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory()
JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(dataSource());
em.setPackagesToScan(new String[] "com.dh.test.model.customer");
em.setJpaVendorAdapter(vendorAdapter);
em.setJpaProperties(additionalJpaProperties());
em.setPersistenceUnitName("customers");
return em;
Properties additionalJpaProperties()
Properties properties = new Properties();
properties.setProperty("hibernate.ddl-auto", "update");
properties.setProperty("jdbc.dialect", "org.hibernate.dialect.mysqlDialect");
properties.setProperty("hibernate.show-sql", "true");
return properties;
@Bean
public DataSource dataSource()
return DataSourceBuilder.create()
.url("jdbc:mysql://localhost:3306/customer")
.driverClassName("com.mysql.jdbc.Driver")
.username("root")
.password("root")
.build();
@Bean
public JpaTransactionManager transactionManager(EntityManagerFactory customerEntityManager)
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(customerEntityManager);
return transactionManager;
我的 POM.xml 的摘录
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.test</groupId>
<artifactId>boot-multidb-sample</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>boot-multidb-sample</name>
<description>Spring Boot Multiple Database Configuration</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.6.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- Datasource and connection pool dependencies -->
<!-- <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId>
</dependency> -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.33</version>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jpa</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
谁能给出一个可能的解决方案来解决这个错误,我尝试检查依赖关系hirerachy和我项目中的依赖关系。
【问题讨论】:
您正在使用 Spring Boot,然后使用 Spring Boot。为什么你要自己配置所有东西,而 spring boot 已经为你做了这些(基本上你可以删除你的整个配置类)。此外,您的应用程序类缺少@EnableAutoConfiguration
或将所有 3 个注释替换为单个 @SpringBootApplication
并添加 spring-boot-starter-web
作为依赖项。
我正在尝试在 jpa 中创建一个层以在数据库中生成单独的模式,这就是我自己配置 evrything 的原因。
你仍然可以使用 Spring Boot。您的当前正在覆盖默认值,您只有一个事务管理器。只要您没有多个实体管理器,您就不需要做这样的事情。重点是错误的Application
类(缺少注释)以及缺少依赖项的事实。
非常感谢您的解决方案。@M.Deinum
另外你的spring-jpa
依赖是旧的,永远不要混合框架的版本,删除那个依赖(因为它已经由 Spring 为你管理)。
【参考方案1】:
在我看来,EmbeddedServletContainerFactory bean 没有初始化。你需要启动它:
将@SpringBootApplication 注解添加到您的应用程序类中
@SpringBootApplication
public class Application
public static void main(String[] args)
SpringApplication.run(ScheduledTasks.class, args);
@SpringBootApplication 注解包含
@配置 @ComponentScan @EnableAutoConfiguration(这可能会解决您的问题)您可能还需要在 pom 中添加 spring-boot-starter-web 依赖项:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
来源: Spring boot error :Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean
Spring Boot: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean
【讨论】:
我经历了这些可能的解决方案,但没有成功。 在我看来问题可能出在您的 pom 文件中。和其他 cmets 中提到的一样,确保 spring jar 文件都是相同的版本,并且你已经添加了所有你需要的 jar 哪一个是你的 Application 类的第 13 行?【参考方案2】:在您的名为 Application 的类中(即在您编写 SpringApplication.run("...")
的类中,您必须为注解 @SpringBootApplication
导入 org.springframework.boot.autoconfigure.SpringBootApplication
。
如果您导入 import org.springframework.boot.SpringBootConfiguration
,那么您将得到该异常。
【讨论】:
以上是关于线程“主”org.springframework.context.ApplicationContextException 中的异常:无法启动嵌入式容器;的主要内容,如果未能解决你的问题,请参考以下文章
多线程异步操作导致异步线程获取不到主线程的request信息
线程“main”中的异常 java.lang.NoClassDefFoundError: org/springframework/boot/SpringApplication at com.javac
执行目标 org.springframework.boot:spring-boot-maven-plugin:2.4.4:repackage failed: 找不到主类的 default-cli