我有弹簧测试用例如下所示,当我运行它时没有启动Netty服务器并提供以下异常。
Caused by: 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 org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:155)
以下是我的测试用例:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringWebFluxDemoApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
public class CustomPriceControllerTest {
@Autowired
private ApplicationContext context;
private WebTestClient testClient;
@Before
public void init() {
testClient = WebTestClient.bindToApplicationContext(context).configureClient().baseUrl("http://localhost:8080").responseTimeout(Duration.ofSeconds(30)).build();
}
@Test
public void broadcastVoltageConsumption() {
this.testClient.get().uri("/api/getCustomPrice")
.accept(MediaType.APPLICATION_STREAM_JSON)
.exchange()
.expectBodyList(Custom.class)
.consumeWith((customResults) -> {
List<Custom> list = CustomResults.getResponseBody();
Assert.assertTrue(list != null && list.size() > 0);
});
}
}
我的pom.xml已经排除了tomcat启用Netty的依赖关系。我的Spring启动类工作得很好。它启动Netty服务器。
更新 - pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
<exclusions>
<!-- Exclude the Tomcat dependency -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
不得不添加javax.servlet-api,因为我遇到了缺少javax.servlet-api的问题。
更新 - 2 从pom.xml中删除javax.servlet依赖项解决了这个问题。
当我尝试运行我的主应用程序时,它会正常启动Netty服务器。这个配置缺少什么?任何人都可以帮忙吗?
答案 0 :(得分:3)
您希望网络服务器由Netty提供支持,但您获得的异常是特定于Servlet的
由于Netty不是基于servlet的技术,你似乎在某处(gradle / maven / @Configuration)混合它们, 所以,只需删除对Servlet依赖项的所有引用,然后重试
答案 1 :(得分:1)
如果任何依赖项都需要一个servlet,它将迫使Jetty出现,并且netty在这种情况下将永远不会启动。
每当看到webflux正在启动Jetty而不是netty时,都应运行以下命令,然后搜索将Jetty作为依赖项的人,然后您将找到答案。
./gradlew dependencies
在您的情况下,您直接包含了导致该问题的servlet依赖性。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>test</scope>
</dependency>
答案 2 :(得分:0)
我有同样的问题。我只是删除了此依赖项(具有servlet依赖项):
testCompile('org.springframework.restdocs:spring-restdocs-mockmvc')