Используя как Vaadin, так и Spring WebFlux в приложении Spring, как я могу настроить маршруты?

Я запускаю новое веб-приложение, используя Spring Boot 2.0. Я хотел бы использовать Vaadin 8 для предоставления пользовательского интерфейса. Кроме того, я хотел бы предоставить интерфейс API с использованием среды WebFlux, предоставляемой Spring 5.

Однако кажется, что включение Vaadin в мой build.gradle приводит к игнорированию моих маршрутов WebFlux:

    compile('com.vaadin:vaadin-spring-boot-starter')

Когда я настроил Vaadin, я вижу, что он предположительно настраивается при запуске:

2017-09-16 16:04:52.332  INFO 19413 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Registering Vaadin servlet
2017-09-16 16:04:52.333  INFO 19413 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Servlet will be mapped to URLs [/vaadinServlet/*, /VAADIN/*]
2017-09-16 16:04:52.356  INFO 19413 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Setting servlet init parameters
2017-09-16 16:04:52.356  INFO 19413 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [productionMode] = [false]
2017-09-16 16:04:52.357  INFO 19413 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [resourceCacheTime] = [3600]
2017-09-16 16:04:52.357  INFO 19413 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [heartbeatInterval] = [300]
2017-09-16 16:04:52.357  INFO 19413 --- [ost-startStop-1] c.v.s.b.i.VaadinServletConfiguration     : Set servlet init parameter [closeIdleSessions] = [false]
2017-09-16 16:04:52.441  INFO 19413 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-09-16 16:04:52.444  INFO 19413 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'springVaadinServlet' to [/vaadinServlet/*, /VAADIN/*]

Когда я удаляю Vaadin, я вижу, что мои маршруты WebFlux настраиваются:

2017-09-16 16:07:51.434  INFO 19441 --- [  restartedMain] o.s.w.r.f.s.s.RouterFunctionMapping      : Mapped (Accept: [application/json] && /api) -> /document -> org.springframework.web.reactive.function.server.RouterFunction$$Lambda$203/43414926@76ae76e8

Я не вижу этого с активным Vaadin. Кажется, что стартовый пакет Vaadin Spring Boot переопределяет все.

Я попытался изменить путь к своим компонентам @SpringUI, чтобы они не находились в корне, но это ничего не изменило.

Я также пробовал это:

@WebServlet(value = "/myspringuis/*", asyncSupported = true)
public class MySpringServlet extends SpringVaadinServlet {
}

Я не понимаю, как SpringVaadinServlet точно вписывается в это, но подозреваю, что это связано с моей проблемой.

Возможно ли одновременное использование Vaadin и WebFlux? Очевидно, я хотел бы разделить маршруты, чтобы WebFlux обрабатывал /api/*, а Vaadin обрабатывал все остальное.


person whee    schedule 16.09.2017    source источник
comment
Насколько я знаю, для Spring Boot 2 еще нет Vaading starter. Spring Boot 2.0 не является окончательным (как и ни один из проектов Spring, которые он использует).   -  person M. Deinum    schedule 18.09.2017


Ответы (1)


vaadin-spring-boot-starter, скорее всего, приносит spring-boot-starter-web (который приносит контейнер сервлетов и настраивает Spring MVC).

Вы не можете настроить Spring MVC и Spring WebFlux в одном приложении.

person Brian Clozel    schedule 18.09.2017
comment
Почему бы нет? Я не пробовал, но если у вас есть каждый из них в разных суб-URI, это должно работать. - person BrunoJCM; 14.11.2018
comment
Поскольку Spring Boot явно запрещает это: оба имеют разные модели времени выполнения сервера и не должны работать на одной и той же JVM. - person Brian Clozel; 14.11.2018