【问题标题】:Getting Stack Overflow when including query in grails validator在 grails 验证器中包含查询时出现堆栈溢出
【发布时间】:2010-01-04 21:36:26
【问题描述】:
altEmailAddress(blank: true, nullable: true, validator: {
    if (it == null || it == '') {
        return true
    } else {
        return (User.countByEmailAddress(it) > 0 && User.countByAltEmailAddress(it) > 0)
    }
}

堆栈跟踪:

测试用例:testFindValidEmailAddress 耗时 0.429 秒 导致错误 空值 java.lang.StackOverflowError 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36) 在 com.clearlyINNOVATIVE.model.User$__clinit__closure7_closure13.doCall(User.groovy:36)

【问题讨论】:

    标签: grails grails-validation


    【解决方案1】:

    您应该使用 withNewSession - 请参阅 http://adhockery.blogspot.com/2010/01/upgrading-grails-11-12.html

    编辑:为 1.1.x 添加:

    如果您还没有使用 1.2 并且 withNewSession() 不可用,您可以在 BootStrap 中自行连接:

    import org.hibernate.Session
    import org.springframework.orm.hibernate3.HibernateCallback
    import org.springframework.transaction.support.TransactionSynchronizationManager
    import org.springframework.orm.hibernate3.SessionHolder
    import org.springframework.orm.hibernate3.HibernateTemplate
    
    class BootStrap {
    
       def grailsApplication
       def sessionFactory
    
       def init = { servletContext ->
          for (domainClass in grailsApplication.domainClasses) {
             domainClass.metaClass.static.withNewSession = { Closure callable ->
                HibernateTemplate template = new HibernateTemplate(sessionFactory)
                SessionHolder sessionHolder = TransactionSynchronizationManager.getResource(sessionFactory)
                Session previousSession = sessionHolder?.session
                try {
                   template.alwaysUseNewSession = true
                   template.execute({ Session session ->
                      sessionHolder.addSession(session)
                      callable(session)
                   } as HibernateCallback)
                }
                finally {
                   if (previousSession) {
                      sessionHolder.addSession(previousSession)
                   }
                }
             }
          }
       }
    
       def destroy = {}
    }
    

    【讨论】:

    • 还有其他选择吗?我还没升级到1.2,还在1.1.2
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多