gpt4 book ai didi

java - Vaadin + TabSheet + Grails Service = 当前线程没有 session

转载 作者:行者123 更新时间:2023-12-02 15:56:00 25 4
gpt4 key购买 nike

晚上好。我在使用 Vaadin 和 tabsheet 组件与 Grails 服务时遇到问题。

这是我想要做的。我有一个 Vaadin UI,它有一个选项卡作为其主要组件,其中有两个不同的选项卡,我在其中放置了一些组件:第一个选项卡具有带有其他嵌套组件的 VerticalLayout,第二个选项卡具有作为其根的 formlayout,以及其他嵌套在里面的视觉组件。

现在,我想要做的是,每当从第一个选项卡切换到第二个选项卡时,第二个选项卡中的组件的数据(持久保存在数据库中)使用 Grails 服务加载并分配给内部的组件。具体来说,每当我切换到包含所述组件的第二个选项卡时,我只想加载一个内联日期字段和一个 slider 值,其中包含以前保存的数据。为了实现这一点,我编写了 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 中注入(inject)了获取第二个选项卡中组件所需数据所需的服务,使用 @AutoWired 注释。上面的异常使我相信切换到另一个选项卡实际上会创建另一个线程,这会导致服务出现问题,因为很明显, hibernate session 被破坏了。

这是有问题的代码段:
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 应用程序中注入(inject)的 grails 服务:
class MyUI extends UI {

@Autowired
NotificationProgrammingService notificationProgrammingService

请注意,我有另一个注入(inject)服务,可以完美地用于我在第一个选项卡上的日历组件。所以我知道这与 Grails 服务和 Vaadin 之间的不兼容性或 @AutoWired 注释的问题无关。它与从一个选项卡更改到另一个选项卡以及 hibernate session 被丢弃有关。

我非常感谢我能在这个问题上得到的任何帮助。我只是无法找到足够的信息来说明为什么会发生这种情况。先感谢您

最佳答案

我通过在 Vaadin.config 中启用 opensessioninview 选项解决了这个问题。显然,当我切换选项卡时, hibernate session 正在关闭,但我不明白它为什么关闭,这允许在选项卡切换完成时 session 可用

关于java - Vaadin + TabSheet + Grails Service = 当前线程没有 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33705516/

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