2014-09-06 133 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