2014-09-06 151 views
0

從REST調用觸發的從遠程服務器加載數據的過程。集成測試失敗:Grails集成測試和sessionFactory.currentSession

java.lang.NullPointerException: Cannot get property 'currentSession' on null object 

負荷大量的數據,所以調用flush裝載每隔幾百記錄:

protected cleanUpGorm() { 
    def session = sessionFactory.currentSession 
    session.flush() 
    session.clear() 
} 

如前所述會話工廠沒有加載。這是一個'助手時髦類' - 既不是服務也不是控制器。我必須現在按照GrailsApplication傳遞sessionFactory嗎?

回答

0

問題是將「sessionFactory」bean注入到常規的groovy類中。 應該使用下面的代碼可以訪問:

ApplicationContext context = (ApplicationContext) ServletContextHolder.getServletContext().getAttribute(GrailsApplicationAttributes.APPLICATION_CONTEXT); 
SessionFactory sessionFactory = context.getBean('sessionFactory') 
Session currentSession = sessionFactory.getCurrentSession() 

用於獲取當前會話的另一種技術,可以使用Grails實用類:

Session session = RequestContextHolder.currentRequestAttributes().getSession() 

Session session = WebUtils.retrieveGrailsWebRequest().session 
+0

不幸的是,你在說桔子和檸檬通過Grails工具類檢索會話。 'WebUtils.retrieveGrailsWebRequest()。session'不是'org.hibernate.session'的相對值。 'GrailsHttpSession'是來自不同類別的繼承者。因此,使用'def session = WebUtils.retrieveGrailsWebRequest()。session'將不允許你執行像session.createSQLQuery(...)這樣的請求。我仍然在摸索我的頭腦是否真的可以在集成測試中嘲笑sessionFactory。以上所有建議都不適用於我 – 2017-04-07 09:49:59