Vaadin 7 UI会话过早关闭

时间:2016-03-01 15:28:17

标签: java session web vaadin vaadin7

在我目前的项目中,基于<nav class="navbar navbar-default navbar-fixed-top"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a href="file:///C:/Users/Maria/Desktop/Vale%26Andrea/indexVA.html" class="navbar-left"><img src="images/cuori.png" height="42" alt="Valentina e Andrea" title="Valentina e Andrea">Valentina e Andrea</a> </div> <div class="collapse navbar-collapse" id="myNavbar"> <ul class="nav navbar-nav navbar-right"> <li><a href="noi.html" target="_blank">Noi</a></li> <li><a href="#">Il Grande Giorno</a></li> <li><a href="#">Lista Nozze</a></li> <li><a href="https://docs.google.com/forms/d/1C2kx4ete4K7238-VPHktfyCymZJqh-FjWh2fstvgy3g/viewform" target="_blank">Scrivici!</a></li> </ul> </div><!--/.nav-collapse --> </div> </nav> <!-- Main jumbotron for a primary marketing message or call to action --> <div class="jumbotron"> <div class="container"> <h1>Auguri a <a href="noi.html" target="_blank" role="button"> NOI! </a></h1> </div> </div> ,我收到一个错误,我在代码中找不到解释。在这个应用程序中,我为一个UI会话打开了一堆EntityManagers,然后在会话被分离时(当调用Vaadin 7.6.2时)关闭它们。现在我的问题是我的日志清楚地说明会话被分离然后再次使用。 AFAIK这不应该发生,对吗?

以下是日志文件的摘录:

UI.detatch()

您可以看到会话***  || 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)      ||         [...] 已在BEC3759B529AC42AA7FFE62314633979关闭,但在接近一分钟后重新使用。我的印象是,当调用09:59:32:504时(如在日志行2中),UI实例不再使用,因为会话已过期(由于三个任务心跳)?我觉得我对Vaadin UI会话的生命周期有错误的想法。如果有人可以帮助我阐明这个话题,那就太好了。

1 个答案:

答案 0 :(得分:1)

我不确定您要打印哪个会话并在那里引用。

我想您知道这一点,但您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绝对可以用于多个用户界面,实际上您会在uIs中看到名为VaadinSession的地图。现在,您似乎每个浏览器窗口都有一个新的VaadinSession,但是从同一个窗口实例化多个UI对象并不困难,并且它们将共享相同的{{1} }。

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