当前位置: 首页 > 知识库问答 >
问题:

由于缺少EmbeddedServletContainerFactory bean,无法启动EmbeddedWebApplication ationContext

刘高峯
2023-03-14

尝试设置一个简单的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>

我的课程如下所示

@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 ");
    }
}

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

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

我尝试遵循Spring Boot测试:由于缺少EmbeddedServletContainerFactorybean,无法启动EmbeddedWebApplicationContext,但没有成功。

谢谢你的建议

共有3个答案

公冶嘉
2023-03-14

使用此依赖项修复了我的问题:

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
    </dependency>
曹建华
2023-03-14

此外,安迪·威尔金森指出,这在OP的案件中是正确的,但在我的案件中不是

我看到我的Spring靴启动器公猫和

<scope>provided</scope>

(因为我添加了一个servlet初始化器来运行它在野飞)我注释了这一点,并删除了从sping-boo-starter-tomcat依赖中提供的,它开始工作。在这里加上,以防其他人也有同样的问题

郎磊
2023-03-14

您只运行了ScheduledTasks

SpringApplication.run(ScheduledTasks.class);

当您应该运行:

SpringApplication.run(Application.class);

运行ScheduledTasks意味着Spring Boot不知道应用程序中的配置。重要的是,这意味着它看不到@EnableAutoConfiguration,而这正是打开自动配置的原因,因为类路径上有Tomcat,所以创建了嵌入式Tomcat实例。

我将通过将@EnableScheduling注释从ScheduledTasks移动到Application,运行应用程序来解决这个问题。类而不是计划任务。类,并使用@组件注释计划任务

pplication.class:

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

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

    // …
}

计划任务。类别:

@Component
public class ScheduledTasks {

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

移动@EnableScheduling意味着它在它所属的配置类上。运行pplication.class意味着Spring Boot可以看到其所有配置,包括启用组件扫描和启用自动配置。用@Component注释执行任务意味着它是通过组件扫描找到的,并且检测到它的@计划的方法。

这应该会让事情开始运转起来。我还想纠正您的pom,这样您就不会混合使用Spring Boot的版本(目前有1.1.6和1.1.7版本),并摆脱EmbeddedServletContainerFactorybean,而使用应用程序配置端口和会话超时。改为在src/main/resources中的属性:

application.properties:

server.port = 8081
server.session-timeout = 3000

 类似资料: