Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE

1. Overview

In this quick tutorial, we’re going to take a close look at the Spring Boot error “ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean“.

First of all, we’re going to shed light on the main causes behind this error. Then, we’ll dive into how to reproduce it using a practical example and finally how to solve it.

2. Possible Causes

First, let’s try to understand what the error message means. “Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean” says it all. It simply tells us that there is no configured ServletWebServerFactory bean in the ApplicationContext.

The error comes up mainly when Spring Boot fails to start the ServletWebServerApplicationContext. Why? Because the ServletWebServerApplicationContext uses a contained ServletWebServerFactory bean to bootstrap itself.

In general, Spring Boot provides the SpringApplication.run method to bootstrap Spring applications.

The SpringApplication class will attempt to create the right ApplicationContext for us, depending on whether we are developing a web application or not.

For example, the algorithm used to determine if a web application comes from some dependencies like spring-boot-starter-web. With that being said, the absence of these dependencies can be one of the reasons behind our error.

Another cause would be missing the @SpringBootApplication annotation in the Spring Boot entry point class.

3. Reproducing the Error

Now, let’s see an example where we can produce the Spring Boot error. The simplest way to achieve this is to create a main class without the @SpringBootApplication annotation.

First, let’s create an entry point class and deliberately forget to annotate it with @SpringBootApplication:

public class MainEntryPoint {

    public static void main(String[] args) {
        SpringApplication.run(MainEntryPoint.class, args);
    }
}

Now, let’s run our sample Spring Boot application and see what happens:

22:20:39.134 [main] ERROR o.s.boot.SpringApplication - Application run failed
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.
	...
	at com.baeldung.applicationcontextexception.MainEntryPoint.main(MainEntryPoint.java:10)
<strong>Caused by: org.springframework.context.ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean.</strong>
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getWebServerFactory(ServletWebServerApplicationContext.java:209)
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:179)
	... 

As shown above, we get “ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean” error.

4. Fixing the Error

The simple solution to fix our error would be to annotate our MainEntryPoint class with the @SpringBootApplication annotation.

By using this annotation, we tell Spring Boot to auto-configure the necessary beans and register them in the context.

Similarly, we can avoid the error for non-web applications by disabling the web environment. To do so, we can use the spring.main.web-application-type property.

In application.properties:

spring.main.web-application-type=none

Likewise, in our application.yml:

spring: 
    main: 
        web-application-type: none

none means that the application should not run as a web application. It’s used to disable the webserver.

Bear in mind that starting from Spring Boot 2.0, we can also use SpringApplicationBuilder to explicitly define a specific type of web application:

@SpringBootApplication
public class MainClass {

    public static void main(String[] args) {
        new SpringApplicationBuilder(MainClass.class)
          .web(WebApplicationType.NONE)
          .run(args);
    }
}

For a WebFlux project, we can use WebApplicationType.REACTIVE. Another solution could be to exclude the spring-webmvc dependency.

The presence of this dependency in the classpath tells Spring Boot to treat the project as a servlet application and not as a reactive web application. As a result, Spring Boot fails to start the ServletWebServerApplicationContext.

5. Conclusion

In this short article, we discussed in detail what causes Spring Boot to fail at startup with this error: “ApplicationContextException: Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean“.

Along the way, we explained, through a practical example, how to produce the error and how to fix it.

As always, the full source code of the examples is available over on GitHub.

Course – LS – All

Get started with Spring and Spring Boot, through the Learn Spring course:

>> CHECK OUT THE COURSE
res – REST with Spring (eBook) (everywhere)
2 Comments
Oldest
Newest
Inline Feedbacks
View all comments
Comments are open for 30 days after publishing a post. For any issues past this date, use the Contact form on the site.