Vaadin中如何为Route动态设置PreserveOnRefresh?
动态启用Vaadin路由的PreserveOnRefresh特性
在Vaadin 10及以后版本中,确实无法在运行时直接修改注解,但可以通过自定义路由配置的方式实现动态控制,替代你之前Vaadin 8里用多UI结合Spring Profile的方案,具体实现如下:
1. 自定义路由配置器实现动态开关
借助Vaadin的RouteConfiguration类,在应用启动阶段根据配置动态注册路由,决定是否给目标视图添加PreserveOnRefresh行为:
@Configuration public class DynamicRouteSetup { @Value("${vaadin.preserve-refresh.enabled:false}") private boolean enablePreserveRefresh; @PostConstruct public void setupRoutes() { RouteConfiguration appConfig = RouteConfiguration.forApplicationScope(); // 以主视图MainView为例,替换成你的目标路由视图 Class<? extends Component> targetView = MainView.class; if (enablePreserveRefresh) { // 注册路由时附带PreserveOnRefresh元数据,启用刷新保留 appConfig.registerRoute("", targetView, Collections.singleton(PreserveOnRefresh.class)); } else { // 正常注册,不启用刷新保留 appConfig.registerRoute("", targetView); } } }
2. 结合Spring Profile切换配置
和你之前Vaadin 8的思路一致,通过Spring Profile控制配置值:
- 在
application-dev.properties中设置vaadin.preserve-refresh.enabled=true - 在
application-prod.properties中设置vaadin.preserve-refresh.enabled=false
启动应用时指定对应的Profile,即可自动切换是否启用PreserveOnRefresh。
3. 注意事项
- 路由注册必须在应用启动阶段完成,所以用
@PostConstruct或监听Spring的ContextRefreshedEvent来保证时机正确 - 如果有多个路由视图需要控制,遍历所有视图类逐个处理即可
- 这种方式是启动时确定配置,若需运行时动态切换,需重新初始化路由配置,不过这类场景通常都是启动时确定,刚好匹配Spring Profile的使用场景
备选方案:自定义UIProvider
若你的场景更特殊,也可以自定义UIProvider,在创建UI实例时动态控制刷新保留行为,但这种方式不如路由配置直接,仅适合复杂场景。
内容的提问来源于stack exchange,提问作者Oliver Stahl
相关产品推荐
相关产品推荐

