Ошибка «транзакция не выполняется» при выполнении учебника Grails Spring Security Core - PullRequest
1 голос
/ 31 марта 2020

Я следую учебному пособию по Grails Spring Security Core в их документации . Когда я достигаю 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] osboot.SpringApplication: сбой запуска приложения

javax.persistence.TransactionRequiredException: транзакция не выполняется в org.hibernate.internal.SessionImpl.checkTransactionNeeded ( SessionImpl. java: 3586)

Я пытался использовать @Transactional для решения этой проблемы, но это не повлияло на ошибку. Возвращение Bootstrap. groovy к значениям по умолчанию позволяет приложению нормально работать. Чего не хватает (или неправильно) в этом руководстве, что приводит к сбою?

1 Ответ

3 голосов
/ 31 марта 2020

Документация устарела. Hibernate 5.2+ теперь требует транзакций для операций записи. Добавление @Transactional не сработало, потому что init является закрытием, а аннотация применяется к методам или классам.

Создайте новый метод в bootstrap и добавьте к нему транзакционный. затем позвоните с вашего закрытия 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
    } 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...