我试图在春季启动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>
...
答案 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);
}