2015-11-14 30 views
0

晚上好。我在使用Vaadin和標籤頁組件與Grails服務結合時遇到問題。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 

我注入,我的應用程序界面內,以獲得在第二個選項卡要求的組件所需的服務的數據,使用@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應用正在注入我的Grails服務:

class MyUI extends UI { 

    @Autowired 
    NotificationProgrammingService notificationProgrammingService 

注意到,我還有一個注入的服務,完美的作品對我有第一個選項卡上的日曆組件。所以我知道這與Grails服務和Vaadin之間的不兼容或者@AutoWired註解的問題無關。它與從一個標籤更改爲另一個以及休眠會話被丟棄有關。

我非常感謝任何幫助,我可以解決這個問題。我一直無法找到足夠的信息,爲什麼會發生這種情況。預先感謝您

+0

如果我正確理解這一點,當一個標籤是選擇了一個AJAX調用。所以必須有一個控制器來處理這個呼叫。並且控制器會執行一些導致「selectedTabChange()」被調用的魔法。這個* magic *如何工作? –

+0

您不要在Vaadin Enmanuel Rosa中使用控制器。我不知道幕後發生了什麼,但也許你是對的,因爲我們沒有看到如何解決這個問題。 – Greg

+0

你如何管理你的休眠會話?它與vaadin無關。 – Azhar

回答

0

我通過啓用Vaadin.config中的opensessioninview選項解決了此問題。顯然,休眠會話正在關閉,當我切換標籤,但我不明白爲什麼它關閉,這使得會話可以在標籤切換完成時可用

相關問題