Vaadin 14:除SessionDestroyListener外为指定会话添加销毁动作
解决Vaadin 14.8.14中指定会话销毁时执行专属动作的问题
你之前的问题根源在于把会话销毁监听器注册到了全局共享的VaadinService上——所有会话共用同一个Service实例,因此每个会话注册的监听器都会在任意会话销毁时被触发,最终导致列表中所有关联元素被批量移除。
针对单个会话绑定销毁动作,正确的做法是直接给目标VaadinSession添加销毁监听器,而非Service级别:
ui.getSession().addDestroyListener(evt -> { list.remove(this); });
这个监听器只会在当前ui.getSession()对应的会话销毁时触发,仅移除该会话关联的元素,不会影响其他活跃会话的内容。
另外,如果你使用了CDI或Spring的会话作用域Bean,还可以通过作用域Bean的销毁回调实现类似逻辑:
- 对于CDI:给会话作用域Bean添加
@PreDestroy注解的方法,在方法内执行清理逻辑 - 对于Spring:在会话作用域Bean中实现
DisposableBean接口,或者使用@PreDestroy注解
但最直接匹配你需求的还是VaadinSession.addDestroyListener,它能精准绑定到指定会话,确保动作仅在目标会话销毁时执行。
内容的提问来源于stack exchange,提问作者Miłosz Bąbliński
相关产品推荐
相关产品推荐

