线程“主”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

基于TCP/IP协议的socket通讯server

Java 类强制转换异常 - 春季启动

RequestContextHolder与RequestContextUtils