Unable to start ReactiveWebApplicationContext due to missing ReactiveWebServerFactory bean

I have a new springboot application I am attempting to get started.

The error I receive is

org.springframework.context.ApplicationContextException: Unable to start reactive web server; nested exception is org.springframework.context.ApplicationContextException: Unable to start ReactiveWebApplicationContext due to missing ReactiveWebServerFactory bean. at org.springframework.boot.web.reactive.context.ReactiveWebServerApplicationContext.onRefresh(ReactiveWebServerApplicationContext.java:76) ~[spring-boot-2.0.1.RELEASE.jar:2.0.1.RELEASE] 

src/main/java/bubbleshadow/RootController.java

package bubbleshadow; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; @RestController public class RootController { public RootController() { } @GetMapping("/") public Mono<HttpStatus> returnOk() { return Mono.just(HttpStatus.OK); } } 

src/test/java/test/bubbleshadow/RootControllerTest.java

package test.bubbleshadow; import bubbleshadow.RootController; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; // import org.springframework.boot.test.autoconfigure.web.reactive.WebFluxTest; import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; @ExtendWith(SpringExtension.class) @SpringBootTest(classes=RootController.class, webEnvironment = WebEnvironment.RANDOM_PORT) @AutoConfigureWebTestClient public class RootControllerTest { @Autowired WebTestClient webTestClient; @Test public void baseRouteShouldReturnStatusOK() { webTestClient.head().uri("/").exchange().expectStatus().isOk(); } } 

9 Answers

Your configuration is not sufficient for reactive tests.

The reactive WebTestClient as well as ReactiveWebApplicationContext need reactive server in the application context. Add annotation @EnableAutoConfiguration to your RootControllerTest and let Spring's do it for you.

The autoconfiguration searches your class path and after find reactive classes and reactive context then create ReactiveWebServerFactory bean.

2

I assume you are using maven to get your dependencies.

I solved the problem by using:

 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> <version>2.0.3.RELEASE</version> </dependency> 

Instead of:

 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webflux</artifactId> <version>5.0.7.RELEASE</version> </dependency> 
2

For me, the error was being caused by a missing @SpringBootApplication annotation on the Spring class containing the main() method entry point which actually starts the Boot application. Using the following resolved the error:

@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 
0

Likely a corrupt download. Try removing ~/.m2/repository.

You actually just need to change webEnvironment = WebEnvironment.RANDOM_PORT to webEnvironment = WebEnvironment.MOCK in your @SpringBootTest annotation.

@vdou's answer helped me to resolve my issue.

In addition to adding @EnableAutoConfiguration, I also had to manually add the spring application type:

spring: main: web-application-type: reactive 

There is obviously something in my dependencies that is causing Spring not to be able to discover the type.

I hope this helps somebody...

If you are using Kotlin, check if in your Application class that contains the main method, doesnt have this:

runApplication<Application>{ webApplicationType = WebApplicationType.REACTIVE } 

Then change the "REACTIVE" to "SERVELET", will work like a charm.

If None of the above solutions work, try adding

@ContextConfiguration(loader = AnnotationConfigContextLoader.class) 

It may help you

import org.springframework.test.context.support.AnnotationConfigContextLoader; 

Yet another reason this can occur is if you're importing in a configuration class for your test that is not marked with @TestConfiguration annotation

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like