ApplicationContextException:由于缺少EmbeddedServletContainerFactory bean,无法启动EmbeddedWebApplicationContext

Rag*_*eer 4 spring spring-boot

尝试设置一个简单的Web应用程序调度程序.所以这是我的配置:

    <modelVersion>4.0.0</modelVersion>
    <groupId>org.springframework</groupId>
    <artifactId>scheduler</artifactId>
    <version>0.1.0</version>
    <packaging>war</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>1.1.6.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>1.1.7.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <version>1.1.7.RELEASE</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

    </dependencies>
    <properties>
        <start-class>hello.Application</start-class>
    </properties>
    <build>
        <plugins>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>2.4</version>
                <configuration>
                    <archive>
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>lib/</classpathPrefix>
                            <mainClass>hello.Application</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <repositories>
        <repository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>http://repo.spring.io/libs-release</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-releases</id>
            <name>Spring Releases</name>
            <url>http://repo.spring.io/libs-release</url>
        </pluginRepository>

    </pluginRepositories>
</project>
Run Code Online (Sandbox Code Playgroud)

我的课程如下所示

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application implements WebApplicationInitializer {

    public static void main(String[] args) throws Exception {
SpringApplication.run(ScheduledTasks.class);
}
public void onStartup(ServletContext arg0) throws ServletException {

        SpringApplication.run(ScheduledTasks.class);

    }

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory factory = new TomcatEmbeddedServletContainerFactory();
        factory.setPort(8081);
        factory.setSessionTimeout(50, TimeUnit.MINUTES);
        return factory;
    }
}
@EnableScheduling
public class ScheduledTasks {

    @Scheduled(fixedRate = 500)
    public void reportCurrentTime() {
        System.out.println("Testing successful ");
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试启动容器时,我看到了异常

ERROR 2592 --- [ost-startStop-1] o.s.boot.SpringApplication               : Application startup failed
...
...
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)
        ... 20 more
Run Code Online (Sandbox Code Playgroud)

我试图遵循Spring Boot Testing:由于缺少EmbeddedServletContainerFactory bean无法启动EmbeddedWebApplicationContext但是徒劳无功.

请提出,谢谢

And*_*son 6

你只是在运行ScheduledTasks:

SpringApplication.run(ScheduledTasks.class);
Run Code Online (Sandbox Code Playgroud)

什么时候应该运行:

SpringApplication.run(Application.class);
Run Code Online (Sandbox Code Playgroud)

运行ScheduledTasks意味着Spring Boot不知道配置Application.至关重要的是,它意味着它没有看到@EnableAutoConfiguration哪个是自动配置的开关,并且因为您在类路径上有Tomcat,所以创建了嵌入式Tomcat实例.

我会通过移动解决这个问题@EnableScheduling,从注释ScheduledTasksApplication,运行Application.class而不是ScheduledTasks.class,并标注ScheduledTasks@Component:

Application.class:

@Configuration
@EnableAutoConfiguration
@ComponentScan
@EnableScheduling
public class Application implements WebApplicationInitializer {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class);
    }

    // …
}
Run Code Online (Sandbox Code Playgroud)

ScheduledTasks.class:

@Component
public class ScheduledTasks {

    @Scheduled(fixedRate = 500)
    public void reportCurrentTime() {
        System.out.println("Testing successful ");
    }
}
Run Code Online (Sandbox Code Playgroud)

移动@EnableScheduling意味着它在配置类上,它所属的位置.运行Application.class意味着Spring Boot可以看到其所有配置,包括启用组件扫描和启用自动配置.注释ScheduledTasks@Component装置,它的由组件扫描发现及其@Scheduled检测方法.

这应该可以解决问题.我也会纠正你的pom,这样你就不会使用Spring Boot的混合版本(你现在有1.1.6和1.1.7)并摆脱你的EmbeddedServletContainerFactorybean,转而配置端口和会话超时使用application.propertiesin src/main/resources:

application.properties:

server.port = 8081
server.session-timeout = 3000
Run Code Online (Sandbox Code Playgroud)