【问题标题】:Grails integration test and sessionFactory.currentSessionGrails 集成测试和 sessionFactory.currentSession
【发布时间】:2014-10-31 02:33:30
【问题描述】:

从远程服务器加载数据的进程,由 REST 调用触发。集成测试失败:

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

加载大量数据,所以每加载几百条记录就刷新一次:

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

如前所述,会话工厂未加载。这是一个“助手 groovy 类”——既不是服务也不是控制器。我现在必须按照 GrailsApplication 传递 sessionFactory 吗?

【问题讨论】:

    标签: grails


    【解决方案1】:

    问题在于将“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
    

    【讨论】:

    • 不幸的是,您正在谈论通过 grails 实用程序类检索会话的橙子和柠檬。 WebUtils.retrieveGrailsWebRequest().session 不是 org.hibernate.session 的亲戚。 GrailsHttpSession 是来自不同类家族的继承者。因此,使用def session = WebUtils.retrieveGrailsWebRequest().session 将不允许您执行session.createSQLQuery( ... ) 之类的请求。对于在集成测试中真正模拟 sessionFactory 是否真的可行,我仍然摸不着头脑。以上所有建议都不适合我
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多