Spring Boot 应用程序错误

Posted

技术标签:

【中文标题】Spring Boot 应用程序错误【英文标题】:Spring Boot Application Error 【发布时间】:2017-05-10 18:29:52 【问题描述】:

我正在使用 Spring Boot 做我的第一个项目。我收到以下我不知道的错误。我是否缺少下面显示的 build.gradle 中的任何依赖项?运行 Application.java 文件时出现错误。

    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:133) ~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:532) ~[spring-context-4.2.5.RELEASE.jar:4.2.5.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:118) ~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:766) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:361) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at com.bale.route.Application.main(Application.java:12) [classes/:na]
    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:185) ~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.createEmbeddedServletContainer(EmbeddedWebApplicationContext.java:158) ~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.onRefresh(EmbeddedWebApplicationContext.java:130) ~[spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
        ... 8 common frames omitted

以下是我的配置文件。

    **//Application.java**

        package com.test.route;

        import org.springframework.boot.SpringApplication;

        import org.springframework.boot.autoconfigure.SpringBootApplication;
        import org.springframework.boot.builder.SpringApplicationBuilder;
        import org.springframework.boot.context.web.SpringBootServletInitializer;

        @SpringBootApplication
        public class Application extends SpringBootServletInitializer

            public static void main(String[] args) 
                SpringApplication.run(Application.class, args);
            
            protected SpringApplicationBuilder configure(

                    SpringApplicationBuilder application) 

                return application.sources

    (Application.class);

        
    

//build.gradle

    buildscript 
        repositories 
            mavenCentral()
        
        dependencies 
            classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")
        
    
    apply plugin: 'war'
    apply plugin: 'java'
    apply plugin: 'spring-boot'



    repositories 
        mavenCentral()
    

    sourceCompatibility = 1.7
    targetCompatibility = 1.7

    dependencies 
         compile("org.springframework.boot:spring-boot-starter-web")
         

            exclude module: 'spring-boot-starter-tomcat'


        



        // tag::actuator[]
        //compile("org.springframework.boot:spring-boot-starter-actuator")
        compile("org.apache.tomcat.embed:tomcat-embed-core")
        // end::actuator[]
        // tag::tests[]
        //testCompile("org.springframework.boot:spring-boot-starter-test")
        // end::tests[]
    

    task wrapper(type: Wrapper) 
        gradleVersion = '2.3'
    

//application.properties

    server.servlet-path= /app
    logging.level.org.springframework=DEBUG
    spring.mvc.view.prefix=/WEB-INF/jsp/
    spring.mvc.view.suffix=.jsp
    cookie.path=
    cookie.domain=

我的配置中缺少什么?

【问题讨论】:

您不应排除 spring-boot-starter-tomcat 。删除 tomcat-embed-core 的排除和显式声明。 【参考方案1】:

我明白了,您出于某种原因从spring-boot-starter-web 中排除了spring-boot-starter-tomcat,并添加了org.apache.tomcat.embed:tomcat-embed-core 作为依赖项。

根据例外情况,您没有 bean EmbeddedServletContainerFactory。在我看来,这个 bean(确切的 TomcatEmbeddedServletContainerFactory)是在 spring-boot-starter-tomcat 依赖项中的某些配置中创建的。所以看起来,你必须离开spring-boot-starter-tomcat,否则你将不得不自己创建这个bean。

【讨论】:

感谢您的回复,斯坦尼斯拉夫。但即使我注释掉排除项,我仍然会遇到同样的错误。 您能告诉我,您是如何运行它的吗?作为独立的 jar 还是作为可部署的战争? 我将它作为一个独立的 jar 运行。我将 Application.java 文件(如上所示)作为 java 应用程序运行。 在这种情况下,您不需要扩展SpringBootServletInitializer。只有可部署的战争创建才需要它 你的意思是说如果我将它作为可部署的战争运行,应用程序将可以正常工作。

以上是关于Spring Boot 应用程序错误的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 应用程序错误

将 spring-boot-starter-security 添加到 Spring Boot 应用程序会导致错误 'entityManagerFactory' 或 'persistenceUnitNa

容器化 Spring Boot 应用程序时出现 Docker 错误

启动spring boot应用程序时bean创建错误

获取 Spring-boot 应用程序的白标签错误

AWS Spring Boot 应用程序的 502 错误请求