当前位置: 首页 > 知识库问答 >
问题:

Grails:promise中没有会话。onComplete()

逑翰翮
2023-03-14

Grails 3.2.9

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

控制器:

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]错误异步执行错误:无法获取当前Hibernate会话;嵌套的异常是org。冬眠HibernateException:未找到当前线程的会话

组织。springframework。刀。DataAccessResourceFailureException:无法获取当前Hibernate会话;嵌套的异常是org。冬眠HibernateException:在组织中找不到当前线程的会话。圣杯。奥姆。冬眠GrailsHibernateTemplate。org上的getSession(grailshbernatetemplate.java:317)。圣杯。奥姆。冬眠GrailsHibernateTemplate。doExecute(grailshbernatetemplate.java:273)位于org。圣杯。奥姆。冬眠GrailsHibernateTemplate。在org上执行(grailshbernatetemplate.java:230)。圣杯。奥姆。冬眠GrailsHibernateTemplate。在org上执行(grailshbernatetemplate.java:116)。圣杯。奥姆。冬眠验证。唯一约束。grails上的processValidate(UniqueConstraint.java:149)。验证。抽象约束。在grails上验证(AbstractConstraint.java:107)。验证。约束属性。在org上验证(ConstrainedProperty.java:979)。圣杯。验证。GrailDomainClassValidator。位于org的validatePropertyWithConstraint(grailDomainClassValidator.java:206)。圣杯。验证。GrailDomainClassValidator。在org上验证(GrailsDomainClassValidator.java:81)。圣杯。奥姆。冬眠抽象概念。在org上保存(AbstractHibernateGormInstanceApi.groovy:122)。圣杯。数据存储。戈姆。GormEntity$Trait$Helper。保存(GormEntity.groovy:151)到org。圣杯。数据存储。戈姆。GormEntity$Trait$Helper$save$11。在组织上呼叫(未知来源)。科德豪斯。棒极了。运行时。呼叫站点。CallSiteArray。org上的defaultCall(CallSiteArray.java:48)。科德豪斯。棒极了。运行时。呼叫站点。抽象调用站点。在org上调用(AbstractCallSite.java:113)。科德豪斯。棒极了。运行时。呼叫站点。抽象调用站点。在com上调用(AbstractCallSite.java:133)。照顾印加。树枝在com上保存(Branch.groovy)。照顾印加。树枝在org上保存(Branch.groovy)。圣杯。数据存储。戈姆。GormEntity$节省$1。在组织上呼叫(未知来源)。科德豪斯。棒极了。运行时。呼叫站点。CallSiteArray。org上的defaultCall(CallSiteArray.java:48)。科德豪斯。棒极了。运行时。呼叫站点。抽象调用站点。在org上调用(AbstractCallSite.java:113)。科德豪斯。棒极了。运行时。呼叫站点。抽象调用站点。在com上调用(AbstractCallSite.java:125)。照顾印加。AdminController$\u addBranch\u closure1$$EQKTGeEk。doCall(AdminController.groovy:43)在sun。反映NativeMethodAccessorImpl。在sun上调用0(本机方法)。反映NativeMethodAccessorImpl。在sun上调用(NativeMethodAccessorImpl.java:62)。反映DelegatingMethodAccessorImpl。在java上调用(DelegatingMethodAccessorImpl.java:43)。朗。反思。方法在org调用(Method.java:498)。springsource。加载。里。重新加载类型调用程序$2。在org调用(reloadeTypeInvoker.java:133)。springsource。加载。里。反射接收器。jlrMethodInvoke(reflectVeInterceptor.java:1461)位于org。科德豪斯。棒极了。反射缓存方法。在groovy上调用(CachedMethod.java:93)。lang.MetaMethod。doMethodInvoke(MetaMethod.java:325)位于org。科德豪斯。棒极了。运行时。元类。Closure元类。groovy上的invokeMethod(ClosureMetaClass.java:294)。lang.MetaClassImpl。org上的invokeMethod(MetaClassImpl.java:1027)。科德豪斯。棒极了。运行时。呼叫站点。PogoMetaClassSite。在org上调用(PogoMetaClassSite.java:42)。科德豪斯。棒极了。运行时。呼叫站点。CallSiteArray。org上的defaultCall(CallSiteArray.java:48)。科德豪斯。棒极了。运行时。呼叫站点。PogoMetaClassSite。拨打org(PogoMetaClassSite.java:57)。科德豪斯。棒极了。运行时。呼叫站点。抽象调用站点。在org上调用(AbstractCallSite.java:125)。圣杯。插件。网状物异步的。AsyncWebRequestPromiseDecorator。org上的invokeClosure(AsyncWebRequestPromiseDecorator.groovy:91)。圣杯。插件。网状物异步的。AsyncWebRequestPromiseDecorator$\u decoration\u closure2。doCall(AsyncWebRequestPromiseDecorator.groovy:67)位于org。圣杯。插件。网状物异步的。AsyncWebRequestPromiseDecorator$\u decoration\u closure2。在org上调用(AsyncWebRequestPromiseDecorator.groovy)。圣杯。异步的。工厂GPAR。GparsPromise$\u onComplete\u closure1。org上的doCall(GparsPromise.groovy:92)。圣杯。异步的。工厂GPAR。GparsPromise$\u onComplete\u closure1。在groovyx上调用(GparsPromise.groovy)。GPAR。数据流。一美元。在java上运行(DataCallback.java:62)。util。同时发生的线程池执行器。java上的runWorker(ThreadPoolExecutor.java:1142)。util。同时发生的线程池执行器$Worker。在java上运行(ThreadPoolExecutor.java:617)。朗。丝线。运行(Thread.java:745)由:org引起。冬眠HibernateException:在组织中找不到当前线程的会话。圣杯。奥姆。冬眠GrailSessionContext。org上的currentSession(GrailsSessionContext.java:116)。冬眠内部的SessionFactoryImpl。组织上的getCurrentSession(SessionFactoryImpl.java:688)。圣杯。奥姆。冬眠GrailsHibernateTemplate。getSession(GrailsHibernateTemplate.java:315)。。。省略公共帧44

共有2个答案

家浩瀚
2023-03-14

感谢您,通过本文提到的更改:

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);
  }
}   
马国源
2023-03-14

对于这种情况,您应该使用with transactionwith session自己处理事务上下文:

p.onComplete { b ->
  Branch.withTransaction{
    println "finished adding branch $branchName"        
    newBranch.active = true
    newBranch.save()
  }
}    
 类似资料:
  • MyDao类有通过Hibernate SessionFactory完成整个持久性任务的方法,它工作得很好。 如上所示,我在MyService中注入了MyDao,但是在注入MyDao后调用@PostConstruct init()方法(调试时,我可以看到MyDao被很好地注入)时,会出现下一个Hibernate异常: org.hibernate.Hibernate异常:没有找到当前线程的会话 我的服

  • 问题内容: 有没有一种方法可以在PHP中启动持久性会话而无需放置会话cookie?是否还有其他方法可以跨页面维护会话,例如基于IP地址的解决方案? 我问的原因是,尽管大多数用户都启用了cookie,但我想看看是否有一种方法可以使禁用它的用户使用登录系统(即使我个人认为禁用cookie只是不必要的偏执狂)。 问题答案: 我认为要求您的用户启用Cookie并不过分。当人们完全关闭它们时,我觉得很愚蠢。

  • 早上好, 当我从Hibernate3升级到4时,出现了“臭名昭著的”当前会话错误。我搜索了一下,似乎一切都安排妥当了。我需要一些洞察力:) 这是我的配置:Spring3.2Hibernate4.1.9 数据源上下文: 业务背景: 我的服务层: 最后,DAO实现: 这里是stackTrace: 谢谢你的帮助! 编辑: 好的,我清理了配置文件,现在: 对于DAO: 对于业务层: 并从DAO中删除@Tr

  • 问题内容: 我正在使用Node.js,Express和Redis构建一个用于会话管理的网站。无论出于何种原因,如果我有一个会话变量(在此示例中),并且刷新页面,则不会保存该变量,但是,如果我在设置了变量后调用,则确实会将其保存到Redis(redis- cli监视器显示此内容-不调用表示变量不存在,而调用则显示该变量)。 我正在使用它来设置和启动服务器: 然后,在那条路线中,我有: 由此,我应该能

  • 我使用的是Spring框架和hibernate,我在其中映射了@OneToMany,当我加载类别来创建新产品时,我得到一个错误:在hibernate中用映射惰性地初始化集合失败,我以前看到过一些说明,请删除FectType。懒惰和我这样做了,但仍然没有效果 类别JAVA Product.java 我在用JPA 这是控制器的代码 product-form.jsp 但我得到错误 "我不知道哪里错了,我

  • 问题内容: 我有一个看起来像这样的错误: 无法初始化代理-没有会话 我正在使用java,hibernate和spring。尝试生成PDF文档时会出现此错误,我正在按照以下步骤即时生成它并存储在数据库中。 我通过POST方法向应用发送了请求。这将即时生成PDF并显示给用户。 在该请求之后,我发送了另一个请求,但是通过ajax发送了一个请求。这将生成相同的PDF,但会将其保存在数据库中。 该错误表明由