Vaadin + TabSheet + Grails Service =当前线程没有会话

时间:2015-11-14 05:43:09

标签: java hibernate grails tabs vaadin7

晚上好。我在使用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会话被丢弃。

我非常感谢能解决这个问题的任何帮助。我还没有找到足够的信息来说明为什么会这样。提前谢谢

1 个答案:

答案 0 :(得分:0)

我通过启用Vaadin.config中的opensessioninview选项解决了这个问题。显然,当我切换标签时,hibernate会话正在关闭,但我不明白为什么它关闭,这使得会话切换完成时会话可用