一起使用“ spring-boot-starter-webflux”和“ spring-boot-starter-web”

时间:2019-06-14 07:24:09

标签: java spring spring-boot spring-mvc spring-webflux

我试图在春季启动MVC应用程序中使用WebClient而不是RestTemplate,但是我找不到仅WebClient的特定依赖项,我的应用程序已完全MVC和the Spring Boot reference documentation section about WebFlux, adding both web and webflux starters中所述将配置Spring MVC Web应用程序,但事实并非如此,当我同时添加两者时,收到以下错误

2019-06-14 09:10:13.196  WARN 69495 --- [  restartedMain] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration': Unsatisfied dependency expressed through constructor parameter 3; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration$EnableWebFluxConfiguration': Initialization of bean failed; nested exception is java.lang.IllegalStateException:

The Java/XML config for Spring MVC and Spring WebFlux cannot both be enabled, e.g. via @EnableWebMvc and @EnableWebFlux, in the same application.

请注意,我未在任何Config类上使用@EnableWebMvc@EnableWebFlux

这是我的Pom

...
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </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>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
        </dependency>
...

2 个答案:

答案 0 :(得分:0)

如提供的链接所述,在the Spring Boot reference documentation section about WebFlux中,如果您想在mvc servlets环境中使用webclient,则添加web和webflux启动器都应该起作用,我只需要清理IDE缓存即可,这就是问题。 注意:如果要以编程方式启动环境,则可以选择以下标准的spring提供的环境

//For Reactive
ConfigurableEnvironment environment = new StandardReactiveWebEnvironment();
//For Servlets mvc environment
ConfigurableEnvironment environment = new StandardServletEnvironment();

答案 1 :(得分:0)

如春季文档Web Application

中所述
  

SpringApplication尝试代表您创建正确的ApplicationContext类型。用于确定WebApplicationType的算法非常简单:

     

如果存在Spring MVC,则使用AnnotationConfigServletWebServerApplicationContext

     

如果不存在Spring MVC且存在Spring WebFlux,则使用AnnotationConfigReactiveWebServerApplicationContext

     

否则,将使用AnnotationConfigApplicationContext

     

这意味着,如果您在同一应用程序中使用Spring MVC和Spring WebFlux中的新WebClient,则默认使用Spring MVC。您可以通过调用setWebApplicationType(WebApplicationType)轻松地覆盖它。

     

也可以完全控制通过调用ApplicationContext使用的setApplicationContextClass(…​)类型。

说如果Spring MVC和Webflux在类路径上,则将首选Spring MVC。这种行为可以被覆盖。

这可能会为您提供一些提示,以帮助您开始调试或尝试按建议将应用程序强制为servlet应用程序。

public static void main(String[] args) {
    final SpringApplication application = new SpringApplication(MyApplication.class);
    application.setWebApplicationType(WebApplicationType.SERVLET);
    application.run(args);
}