spring-boot-starter-web和spring-boot-starter-webflux不能一起工作吗?

时间:2018-07-17 09:22:14

标签: java spring-boot spring-webflux

当我开始学习spring-webflux时,我对这个组件有疑问。

我构建了一个简单的项目,使用Maven来管理该项目,并添加了有关spring-boot-starter-web和spring-boot-starter-webflux的依赖项,例如:

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

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

但是它不起作用。删除spring-boot-starter-web依赖项时,它可以很好地工作。

2 个答案:

答案 0 :(得分:5)

the Spring Boot reference documentation section about WebFlux中所述,同时添加web和webflux启动器将配置Spring MVC Web应用程序。

这是这样的,因为许多现有的Spring Boot Web应用程序(使用MVC)将依赖webflux启动器来使用WebClient。 Spring MVC partially support reactive return types,因此这是预期的用例。相反的情况并非如此,因为反应性应用程序不太可能使用Spring MVC位。

因此支持同时使用web和webflux启动器,但它将配置Spring MVC应用程序。您始终可以通过以下方式强制Spring Boot应用程序进行反应:

SpringApplication.setWebApplicationType(WebApplicationType.REACTIVE)

但是清理依赖关系仍然是一个好主意,因为在响应式Web应用程序中使用阻止功能很容易。

答案 1 :(得分:0)

使用spring-boot-starter-webfluxspring-data-geode引起了类似的问题

DEBUG [http-nio-8082-exec-2] org.sprin.web.servl.resou.ResourceHttpRequestHandler 454 handleRequest: Resource not found

已通过更改应用程序类型来解决

@SpringBootApplication
public class Web {
    public static void main(String[] args) {
        SpringApplication app = new SpringApplication(Web.class);
        app.setWebApplicationType(WebApplicationType.REACTIVE);
        SpringApplication.run(Web.class, args);
    }
}

整个班级看起来像这样

enter image description here

设置应用程序类型后,如果我不随后以静态方式调用SpringApplication,则会得到以下信息:

Web