【发布时间】:2015-11-14 05:43:09
【问题描述】:
晚上好。我在使用 Vaadin 和 tabsheet 组件与 Grails 服务时遇到问题。
这就是我想要做的。我有一个 Vaadin UI,它有一个选项卡作为其主要组件,其中有两个不同的选项卡,我在其中放置了一些组件:第一个选项卡具有带有其他嵌套组件的 VerticalLayout,第二个选项卡具有作为其根的 formlayout,以及其他嵌套在里面的可视化组件。
现在,我想要做的是,每当从第一个选项卡切换到第二个选项卡时,第二个选项卡中的组件的数据(持久保存在数据库中)使用 Grails 服务加载并分配给组件里面。具体来说,每当我切换到包含所述组件的第二个选项卡时,我只想加载一个 inlinedatefield 和一个滑块值,其中包含以前保存的数据。为了实现这一点,我编写了 addSelectedTabChangeListener 并在内部调用了我的服务,以便用所需数据填充第二个选项卡的组件。
但是,每当我切换到第二个选项卡时,都会出现以下异常:
| 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 注释。上面的异常让我相信切换到另一个选项卡实际上会创建另一个线程,这会导致服务出现问题,因为很明显,休眠会话被破坏了。
这是有问题的代码:
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 应用程序中注入的 grails 服务:
class MyUI extends UI {
@Autowired
NotificationProgrammingService notificationProgrammingService
请注意,我有另一个注入服务,可以完美地用于我在第一个选项卡上的日历组件。所以我知道这与 Grails 服务和 Vaadin 之间的不兼容性或 @AutoWired 注释的问题无关。它与从一个选项卡切换到另一个选项卡以及休眠会话被丢弃有关。
非常感谢我能在这个问题上获得的任何帮助。我只是无法找到足够的信息来说明为什么会发生这种情况。提前谢谢你
【问题讨论】:
-
如果我正确地理解了,则选择选项卡时,会进行Ajax调用。所以必须有一个控制器来处理这个调用。控制器做了一些魔术,导致
selectedTabChange()被调用。这个魔法是如何运作的? -
你没有在 Vaadin Enmanuel Rosa 中使用控制器。我不知道幕后发生了什么,但也许你是对的,AJAX 调用是正确的,虽然我不明白这是如何解决问题的。
-
你是如何管理你的休眠会话的?它与vaadin无关。
标签: java hibernate grails tabs vaadin7