Vaadin 瓦丁14号改道

Vaadin 瓦丁14号改道,vaadin,vaadin-flow,Vaadin,Vaadin Flow,我正在处理一份Vaadin 14的申请。我希望用户能够转到某个特定的URL,并根据特定的条件,将其重新路由到具有自己路由的多个视图之一 我知道如何使用BeforeEnterHandler/BeforeEnterObserver重新路由。但这只会中断到已知路线的导航,据我所知,需要将该路线链接到实现组件的类,方法是使用@route作为该类的注释或动态注册。这是否意味着我需要使用此路由创建一个虚拟的组件实现,它永远不会显示,只是为了能够在enterHandler之前在中重新路由?或者,在查找相应的视

我正在处理一份Vaadin 14的申请。我希望用户能够转到某个特定的URL,并根据特定的条件,将其重新路由到具有自己路由的多个视图之一

我知道如何使用BeforeEnterHandler/
BeforeEnterObserver
重新路由。但这只会中断到已知路线的导航,据我所知,需要将该路线链接到实现
组件的类,方法是使用
@route
作为该类的注释或动态注册。这是否意味着我需要使用此路由创建一个虚拟的
组件
实现,它永远不会显示,只是为了能够在enterHandler
之前在
中重新路由?或者,在查找相应的视图组件之前,是否有更干净的方法连接到路由生命周期并重新路由

更新: 我写这个问题时考虑了重新路由,但我发现我将使用转发,因为
forwardTo
也会更新浏览器URL,这就是我想要的。但问题仍然是一样的,因为我仍然需要一条通往另一条的路线

更新2:
因为我需要向目标视图提供查询参数,所以我甚至不能使用
forwardTo
UI.navigate
在导航期间调用时显然无法正常工作,因此我需要在NavigationEvent
之后处理
并在那里调用
UI.navigate
。这意味着此时导航已经完成,因此我的路线肯定需要一个
组件作为导航目标。这两个问题(在不创建虚拟UI组件的情况下不可能进行路由处理,并且
forwardTo
不接受查询参数)似乎都是Vaadin框架路由支持的基本缺点。

在我看来,使用路由是最干净的方法,它与框架中的概念一致(在瓦丁语中)“倾听”URL是一个路由。您可以使用
@route
定义路由,或者如果有帮助,您可以使用
RouteConfiguration
动态注册它们。另一个选项是使用Servlet重定向到所需的视图,但我认为这并不干净。

如果在离开前一个视图时无法完成条件逻辑(->如果虚拟视图是用户进入应用程序的入口点),然后带有重路由逻辑的虚拟视图听起来像是一种方式。我不知道有任何直接的路由器干预来实现您想要的,所以我的答案是继续您计划的内容。但是我很可能是错的,所以我不会将其作为实际的答案来编写。确实有一种方法可以避免虚拟视图。在Java中,您可以访问具有
UI.getCurrent().getRouter()的路由器
,但我找不到一种不使用
组件添加路由的方法
@kscherrer确实,此路由应该是一个应用程序入口点。事实上,我个人认为任何视图都应该是可书签的,因此可以直接访问,就像它是一个入口点一样。我的措辞很糟糕。你将URL提供给用户就是应用程序的定义入口点。这就是为什么您不能在上一个视图中使用
BeforeLeaveObserver
执行自定义条件逻辑(因为没有上一个视图)。您无法回避创建虚拟组件的问题。@kscherrer OK。似乎即使是虚拟组件也不允许我做我想做的事情,因为我的目标URL有查询参数,并且在
beforeenterrevent
上没有接受查询参数的
forwardTo
方法:(确实,定义路由是最干净的,但是除了创建视图组件之外,似乎没有其他方法来定义路由。
@route
不适用于普通类和
RouteConfiguration.setRoute(…)
需要一个
ClassFYI,我已经创建了,并且针对我在Vaadin的路由支持中遇到的两个问题。在接受答案之前,我会稍等片刻,以防Vaadin的其他人提出更好的解决方案。感谢您报告这些问题。如果答案有用,请将其标记为已接受。好的,我想简短的答案是此时不存在干净的方法,您必须创建一个虚拟组件来处理路由,或者使用servlet/过滤器。