晚上好。我在使用Vaadin和标签表组件与Grails服务相结合时遇到了问题。
这是我想要做的。我有一个Vaadin UI,它有一个标签页作为其主要组件,其中有两个不同的标签,我放置了一些组件:第一个标签有一个VerticalLayout和其他嵌套组件,第二个标签有一个formlayout作为其根,以及其他视觉组件嵌套在里面。
现在,我想要做的是每当从第一个标签切换到第二个标签时,第二个标签中的组件数据(持久存储在数据库中)使用Grails服务加载并分配给组件内。具体来说,每当我切换到包含所述组件的第二个选项卡时,我只想要一个inlinedatefield和一个滑块值来加载先前保存的数据。为了实现这一点,我编写了addSelectedTabChangeListener,并在i中调用了我的服务,以便用所需数据填充第二个选项卡的组件。
但是,每当我切换到第二个标签时,我都会遇到以下异常:
| Error 2015-11-14 00:43:36,072 [http-bio-8080-exec-8] ERROR server.DefaultErrorHandler -
Message: org.springframework.dao.DataAccessResourceFailureException: Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread
我在应用程序UI中注入了使用@AutoWired批注获取第二个选项卡中组件所需数据所需的服务。上面的例外让我相信切换到另一个选项卡实际上会创建另一个线程,这会导致服务出现问题,因为显然,hibernate会话会被破坏。
以下是有问题的代码:
tabSheet.addSelectedTabChangeListener(new TabSheet.SelectedTabChangeListener() {
@Override
void selectedTabChange(TabSheet.SelectedTabChangeEvent selectedTabChangeEvent) {
if(selectedTabChangeEvent.tabSheet.selectedTab.caption == "Programación de la Notificación") {
def savedNotificationProgramming = notificationProgrammingService.getNotificationProgramming()
GregorianCalendar savedTime = new GregorianCalendar()
savedTime.set(java.util.Calendar.HOUR_OF_DAY, savedNotificationProgramming?.hour)
savedTime.set(java.util.Calendar.MINUTE, savedNotificationProgramming?.minute)
println("hora: " + savedNotificationProgramming?.hour + "minuto: " + savedNotificationProgramming?.minute)
jobSettingsForm.numberOfDays.value = savedNotificationProgramming?.days as Double
jobSettingsForm.time.value = savedTime.time
}
}
})
jobSettingsForm是一个派生自FormLayout的类,它是第二个选项卡的根组件作为其主容器。
notificationProgrammingService是我在MyUI app中注入的grails服务:
class MyUI extends UI {
@Autowired
NotificationProgrammingService notificationProgrammingService
请注意,我有另一个注入的服务,它可以完美地用于第一个选项卡上的日历组件。所以我知道它与Grails服务和Vaadin之间的不兼容性或@AutoWired注释的问题没有关系。它与从一个标签到另一个标签的更改有关,并且hibernate会话被丢弃。
我非常感谢能解决这个问题的任何帮助。我还没有找到足够的信息来说明为什么会这样。提前谢谢
答案 0 :(得分:0)
我通过启用Vaadin.config中的opensessioninview选项解决了这个问题。显然,当我切换标签时,hibernate会话正在关闭,但我不明白为什么它关闭,这使得会话切换完成时会话可用