Использование «spring-boot-starter-webflux» и «spring-boot-starter-web» вместе - PullRequest
0 голосов
/ 14 июня 2019

Я пытаюсь использовать WebClient вместо RestTemplate в моем приложении MVC с весенней загрузкой, но я не смог найти конкретную зависимость только для WebClient, мое приложение полностью MVC и как описано в раздел справочной документации Spring Boot о WebFlux, добавление как веб-стартера, так и веб-флюкс настроит веб-приложение Spring MVC, но это не тот случай. Когда я добавил оба, я получил следующую ошибку

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.

Примечание. Я не использую ни @EnableWebMvc, ни @EnableWebFlux ни в одном из классов Config.

Вот мой 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 голосов
/ 14 июня 2019

Как указано в документации Spring здесь Веб-приложение

SpringApplication пытается создать правильный тип ApplicationContext от вашего имени.Алгоритм, используемый для определения WebApplicationType, довольно прост:

Если присутствует Spring MVC, используется AnnotationConfigServletWebServerApplicationContext

Если Spring MVC отсутствует и Spring WebFlux присутствует,AnnotationConfigReactiveWebServerApplicationContext используется

В противном случае AnnotationConfigApplicationContext используется

Это означает, что если вы используете Spring MVC и новый WebClient от Spring WebFlux в том же приложении, Spring MVC будетиспользоваться по умолчанию.Вы можете легко это переопределить, позвонив по номеру setWebApplicationType(WebApplicationType).

Также возможно получить полный контроль над типом ApplicationContext, который используется при вызове setApplicationContextClass(…​).

Говоритчто если Spring MVC и Webflux находятся на пути к классам, Spring MVC будет предпочтительным.Это поведение может быть изменено.

Это может дать вам несколько советов, с чего начать, где отлаживать или попробовать, как предложено, чтобы приложение было приложением сервлета.

public static void main(String[] args) {
    final SpringApplication application = new SpringApplication(MyApplication.class);
    application.setWebApplicationType(WebApplicationType.SERVLET);
    application.run(args);
}
0 голосов
/ 14 июня 2019

Как упомянуто в предоставленной ссылке, в разделе справочной документации Spring Boot о WebFlux добавление стартеров web и webflux должно работать, если вы хотите использовать webclient в среде сервлетов mvc, я только чтоочистить мой кэш IDE, и это было проблемой.Как примечание: если вы хотите запустить свою среду программно, вы можете выбрать одну из стандартных сред для пружин, как показано ниже

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