You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 02:18:06