【问题标题】:Using both Vaadin and Spring WebFlux in a Spring application, how can I set up routes?在 Spring 应用程序中同时使用 Vaadin 和 Spring WebFlux,如何设置路由?
【发布时间】:2018-02-25 17:43:05
【问题描述】:

我正在使用 Spring Boot 2.0 启动一个新的 Web 应用程序。我想使用 Vaadin 8 来提供 UI。另外,我想提供一个使用 Spring 5 提供的 WebFlux 框架的 API 接口。

但是,似乎在我的 build.gradle 中包含 Vaadin 的行为会导致我的 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 处理其他所有事情。

【问题讨论】:

  • AFAIK 目前还没有适用于 Spring Boot 2 的 Vaading 启动器。 Spring Boot 2.0 不是最终版本(它使用的任何 Spring 项目也不是最终版本)。

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


【解决方案1】:

vaadin-spring-boot-starter 很可能带来了spring-boot-starter-web(它带来了一个 Servlet 容器并配置了 Spring MVC)。

您不能在同一个应用程序中同时配置 Spring MVC 和 Spring WebFlux。

【讨论】:

  • 为什么不呢?我还没有尝试过,但是如果您将它们中的每一个都放在不同的子 URI 中,它应该可以工作。
  • 因为 Spring Boot 明确禁止:两者都有不同的服务器运行时模型,并且不应该在同一个 JVM 上运行。
猜你喜欢
  • 2018-03-26
  • 1970-01-01
  • 2018-10-31
  • 1970-01-01
  • 2018-09-22
  • 1970-01-01
  • 1970-01-01
  • 2018-08-22
  • 2022-12-15
相关资源
最近更新 更多