遵循 Grails Spring Security Core 教程时出现“没有正在进行的事务”错误
Posted
技术标签:
【中文标题】遵循 Grails Spring Security Core 教程时出现“没有正在进行的事务”错误【英文标题】:"No transaction is in progress" error while following Grails Spring Security Core tutorial 【发布时间】:2020-07-11 17:19:02 【问题描述】:我正在关注 Grails Spring Security Core 教程 in their documentation。当我到达 24.1.5.5 时,问题就开始了。我被指示将 Bootstrap.groovy 修改为以下内容,然后运行该应用程序:
package com.mycompany.myapp
class BootStrap
def init =
def adminRole = new Role(authority: 'ROLE_ADMIN').save()
def testUser = new User(username: 'me', password: 'password').save()
UserRole.create testUser, adminRole
UserRole.withSession
it.flush()
it.clear()
assert User.count() == 1
assert Role.count() == 1
assert UserRole.count() == 1
运行应用程序给我这个错误:
2020-03-31 15:46:19.294 错误 --- [restartedMain] os.boot.SpringApplication : 应用程序运行失败
javax.persistence.TransactionRequiredException: 没有事务在 进步 在 org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl .java:3586)
我尝试使用@Transactional 来解决这个问题,但它对错误没有影响。将 Bootstrap.groovy 恢复为其默认值允许应用程序正常运行。本教程缺少什么(或不正确)导致它失败?
【问题讨论】:
【参考方案1】:您也可以尝试https://github.com/grails/grails-core/issues/11376 中的解决方案,其中说您可以将配置添加到 application.yml
hibernate:
allow_update_outside_transaction: true
【讨论】:
这不是最好的解决方案,但它有效【参考方案2】:文档已过期。 Hibernate 5.2+ 现在需要事务来进行写操作。添加@Transactional 不起作用,因为init
是一个闭包,并且注释适用于方法或类。
在引导程序中创建一个新方法并为其添加事务性方法。然后从你的 init 闭包中调用它。例如。
class BootStrap
def init =
addTestUsers()
@Transactional
void addTestUsers()
def adminRole = new Role(authority: 'ROLE_ADMIN').save()
def testUser = new User(username: 'me', password: 'password').save()
UserRole.create testUser, adminRole
UserRole.withSession
it.flush()
it.clear()
assert User.count() == 1
assert Role.count() == 1
assert UserRole.count() == 1
【讨论】:
我创建了一个 PR 来更新文档github.com/grails-plugins/grails-spring-security-core/pull/613 恐怕这对我来说会导致同样的错误。在此之前是否需要进行其他配置? 您使用/配置了什么数据库?我假设您使用的是休眠数据源。 嗯,对不起,我无法重现 - 如果您将项目上传到 github 或其他东西,它可能有助于识别问题。 github.com/dylan-goss/securitytest/blob/master/grails-app/init/… - 你正在使用 spring 的事务 - 请使用 GORM 的,一切都应该工作:)以上是关于遵循 Grails Spring Security Core 教程时出现“没有正在进行的事务”错误的主要内容,如果未能解决你的问题,请参考以下文章
Grails - 卸载 Spring Security Core
Grails - grails-spring-security-rest - 无法从 application.yml 加载 jwt 机密
grails-spring-security-rest 插件和悲观锁定