【问题标题】:Grails: getting No Session in Promise.onComplete()Grails:在 Promise.onComplete() 中没有会话
【发布时间】:2017-05-23 17:48:21
【问题描述】:

Grails 3.2.9

执行任务后,onComplete 方法无法获取休眠会话。

控制器:

def addBranch() {
    Branch newBranch = new Branch(name: branchName, root: newBranchRoot, 'active':false).save();    
    Promise p = gitService.asyncPull(newBranch)     
    p.onComplete { b ->
        println "finished adding branch " + branchName;         
        newBranch.setActive(true);
        newBranch.save();  <<<=== EXCEEPTION THROWN HERE
    }       
    p.onError { Throwable err ->
        println "An error occurred ${err.message}"          
    }       
    respond(status:"ok", message:"success!");       
}   

服务:

public Promise<Branch> asyncPull(Branch branch) {
    WebPromises.task {          
        initBranch(branch);
        pull (branch.name);
        branch;
    }
}

异常堆栈跟踪

2017-05-23 13:41:29.123 [ead 6]ERROR 异步执行错误:无法获取当前休眠会话;嵌套异常是 org.hibernate.HibernateException: No Session found for c 当前话题

org.springframework.dao.DataAccessResourceFailureException: 无法获取当前的 Hibernate Session;嵌套异常是 org.hibernate.HibernateException: No Session found for c 当前线程 在 org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:317) 在 org.grails.orm.hibernate.GrailsHibernateTemplate.doExecute(GrailsHibernateTemplate.java:273) 在 org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:230) 在 org.grails.orm.hibernate.GrailsHibernateTemplate.execute(GrailsHibernateTemplate.java:116) 在 org.grails.orm.hibernate.validation.UniqueConstraint.processValidate(UniqueConstraint.java:149) 在 grails.validation.AbstractConstraint.validate(AbstractConstraint.java:107) 在 grails.validation.ConstrainedProperty.validate(ConstrainedProperty.java:979) 在 org.grails.validation.GrailsDomainClassValidator.validatePropertyWithConstraint(GrailsDomainClassValidator.java:206) 在 org.grails.validation.GrailsDomainClassValidator.validate(GrailsDomainClassValidator.java:81) 在 org.grails.orm.hibernate.AbstractHibernateGormInstanceApi.save(AbstractHibernateGormInstanceApi.groovy:122) 在 org.grails.datastore.gorm.GormEntity$Trait$Helper.save(GormEntity.groovy:151) 在 org.grails.datastore.gorm.GormEntity$Trait$Helper$save$11.call(未知来源) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:133) 在 com.care.incasa.Branch.save(Branch.groovy) 在 com.care.incasa.Branch.save(Branch.groovy) 在 org.grails.datastore.gorm.GormEntity$save$1.call(未知来源) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 在 com.care.incasa.AdminController$_addBranch_closure1$$EQKTGeEk.doCall(AdminController.groovy:43) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在 java.lang.reflect.Method.invoke(Method.java:498) 在 org.springsource.loaded.ri.ReloadedTypeInvoker$2.invoke(ReloadedTypeInvoker.java:133) 在 org.springsource.loaded.ri.ReflectiveInterceptor.jlrMethodInvoke(ReflectiveInterceptor.java:1461) 在 org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93) 在 groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325) 在 org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294) 在 groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1027) 在 org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:42) 在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48) 在 org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:57) 在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125) 在 org.grails.plugins.web.async.AsyncWebRequestPromiseDecorator.invokeClosure(AsyncWebRequestPromiseDecorator.groovy:91) 在 org.grails.plugins.web.async.AsyncWebRequestPromiseDecorator$_decorate_closure2.doCall(AsyncWebRequestPromiseDecorator.groovy:67) 在 org.grails.plugins.web.async.AsyncWebRequestPromiseDecorator$_decorate_closure2.call(AsyncWebRequestPromiseDecorator.groovy) 在 org.grails.async.factory.gpars.GparsPromise$_onComplete_closure1.doCall(GparsPromise.groovy:92) 在 org.grails.async.factory.gpars.GparsPromise$_onComplete_closure1.call(GparsPromise.groovy) 在 groovyx.gpars.dataflow.DataCallback$1.run(DataCallback.java:62) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745) 原因:org.hibernate.HibernateException: No Session found for current thread 在 org.grails.orm.hibernate.GrailsS​​essionContext.currentSession(GrailsS​​essionContext.java:116) 在 org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:688) 在 org.grails.orm.hibernate.GrailsHibernateTemplate.getSession(GrailsHibernateTemplate.java:315) ...省略了44个常用框架

【问题讨论】:

  • 您能否尝试在 onComplete 中再次从 DB 获取分支,而不是使用在方法开始时创建的副本,例如def branch = Branch.get( newBranch.id ) 然后设置激活并保存

标签: hibernate session grails promise


【解决方案1】:

对于这种情况,您应该使用withTransaction 或withSession 自己处理事务上下文:

p.onComplete { b ->
  Branch.withTransaction{
    println "finished adding branch $branchName"        
    newBranch.active = true
    newBranch.save()
  }
}    

【讨论】:

    【解决方案2】:

    谢谢,上面提到的更改有效:

    Promise<Branch> p = gitService.asyncPull(newBranch)     
    p.onComplete { b ->
      Branch.withTransaction { session ->               
        Branch br = Branch.findByName(b.name);
        br.setActive(true);
        br.save(flush:true);
      }
    }   
    

    【讨论】:

      猜你喜欢
      • 2013-01-03
      • 1970-01-01
      • 2011-11-08
      • 2013-04-03
      • 1970-01-01
      • 2010-12-24
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多