Spring Reactive Test案例无法启动Netty Server

时间:2018-05-25 17:48:41

标签: java spring spring-boot spring-webflux

我有弹簧测试用例如下所示,当我运行它时没有启动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服务器。这个配置缺少什么?任何人都可以帮忙吗?

3 个答案:

答案 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')