gpt4 book ai didi

java - Vaadin 7 UI session 过早关闭

转载 作者:行者123 更新时间:2023-12-01 10:19:13 25 4
gpt4 key购买 nike

在我当前基于 Vaadin 7.6.2 的项目中,我收到一个错误,但在代码中找不到相关解释。在此应用程序中,我为 UI session 打开一堆 EntityManager,然后在 session 分离时(调用 UI.detatch() 时)关闭它们。现在我的问题是我的日志清楚地表明 session 已分离然后再次使用。 AFAIK 这不应该发生,对吧?

以下是日志文件的摘录:

***  || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.db.EntityManagerBeanFactory.closeAll()
     || Closed 3 entity managers for session a******.i****

***  || 29.02.2016 09:59:32:504 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | de.darkblue.bagheera.BagheeraUI.detach()
     || Session de.darkblue.bagheera.BagheeraUI@1c5c5ab2 was detatched.

[...]
     
!!!! || 29.02.2016 10:00:21:159 | SESSION BEC3759B529AC42AA7FFE62314633979 | USER a******.i**** | com.vaadin.server.DefaultErrorHandler.doDefault()
     ||  caused by:
     || java.lang.IllegalStateException: Attempting to execute an operation on a closed EntityManager.
     ||         at org.eclipse.persistence.internal.jpa.EntityManagerImpl.verifyOpenWithSetRollbackOnly(EntityManagerImpl.java:1934)
     ||         at org.eclipse.persistence.internal.jpa.EntityManagerImpl.getCriteriaBuilder(EntityManagerImpl.java:2569)
     ||         at de.darkblue.bagheera.ui.tab.EditActivityReportTab.isOverlappingEntry(EditActivityReportTab.java:383)
     ||         [...]

您可以看到 session BEC3759B529AC42AA7FFE6231463397909:59:32:504 关闭,但在近一分钟后重新使用。我的印象是,当调用 UI.detatch() 时(如日志第 2 行所示),UI 实例不再使用,因为 session 已过期(由于三个任务心跳)?我感觉我对 Vaadin UI session 的生命周期有错误的想法。如果有人能帮助我阐明这个主题,那就太好了。

最佳答案

我不确定您正在打印并指的是哪个 session 。

我想您知道这一点,但是您的 HttpSession 包含一个 VaadinSession 对象,该对象包含多个 UI 对象。如果其中任何一个听起来很有趣,我想您会发现这很有帮助 - how to put data in session variable and get the data in different page in vaadin? .

但是,我的感觉是您需要重新考虑您的 EntityManager 生命周期 - 请参阅 https://vaadin.com/docs/-/part/framework/jpacontainer/jpacontainer-hibernate.html

尽管如此,其他人确实提倡采用EM-per-session方法,如下所示 - Save changes to database vaadin

综上所述,同一个 VaadinSession 绝对可以用于多个 UI,事实上,您会在 VaadinSession 中看到一个名为 uIs 的 map >。现在,您似乎确实为每个浏览器窗口获得了一个新的 VaadinSession,但从同一窗口实例化多个 UI 对象并不困难,并且它们将共享相同的内容VaadinSession

最后值得注意的是,大多数正常设置也会在浏览器实例中的所有窗口中具有单个 HttpSession

关于java - Vaadin 7 UI session 过早关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35726857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com