Grails и Hibernate: неизвестный объект: com.mypackage.Role

У меня есть приложение Grails. Я установил плагин Spring Security Core 2.0 RC2 и создаю роли, пользователей и карту запросов в BootStrap.groovy. Grails выдает следующую ошибку при запуске приложения.

ERROR context.GrailsContextLoader  - Error initializing the application: Unknown entity: Role

Вот мой класс Role (генерируется весенним плагином безопасности и модифицируется для расширения AbstractActivity с помощью абстрактного класса, который имеет метод / закрытие beforeInsert() и выполняет некоторую проверку).

package com.mypackage

class Role extends AbstractDomain {

    String authority

    Date dateCreated
    Date lastUpdated
    User createdBy
    User updatedBy

    static mapping = {
        cache true
    }

    static constraints = {
        authority blank: false, unique: true

            createdBy nullable: true
            updatedBy nullable: true
    }
}    

AbstractDomain.groovy

package com.mypackage

import com.mypackage.User

class AbstractDomain implements Serializable {

transient springSecurityService

def beforeInsert() {

    if(null != springSecurityService) {

        User user = springSecurityService.getCurrentUser()

        if(null != user) {

            this.createdBy = user
        }
    }
}

}

BootStrap.groovy

import com.mypackage.Role

class BootStrap {
    def init = { servletContext ->
          if (Role.findByAuthority('ROLE_ADMIN') == null)
                def adminRole = new Role(authority: 'ROLE_ADMIN').save(flush: true)
    }
    def destroy = {}
}

Config.groovy

grails.plugin.springsecurity.userLookup.userDomainClassName ='com.mypackage.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName 'com.mypackage.UserRole'
grails.plugin.springsecurity.authority.className = 'com.mypackage.Role'
grails.plugin.springsecurity.requestMap.className = 'com.mypackage.Requestmap'
grails.plugin.springsecurity.securityConfigType = 'Requestmap'

Как решить проблему с неизвестной сущностью?

4 ответа

Решение

Я нашел решение! Мой класс AbstractDomain, который был расширен классом Role, находился в папке "src / groovy", и я забыл сделать его "абстрактным". Затем я добавил abstract Ключевое слово перед classработает как по волшебству. Спасибо @mgg за предоставленную мне идею здесь

Итак, мой класс AbstractDomain теперь выглядит так

abstract class AbstractDomain implements Serializable {
...

У вас должна быть следующая конфигурация в Config.groovy, чтобы плагин безопасности Spring знал, какой класс вы используете для сохранения ролей:

  grails.plugins.springsecurity.authority.className = "com.mypackage.model.Role"

То же самое относится и к пользователям:

  grails.plugins.springsecurity.userLookup.userDomainClassName = "com.mypackage.model.User"

См. http://grails-plugins.github.io/grails-spring-security-core/docs/manual/guide/domainClasses.html

Попробуйте заменить

import com.mypackage.Role

с

import com.mypackage.model.Role

Это не похоже на проблему с Spring Security. Ошибка исходит от Grails - "Неизвестная сущность: роль". Обычно это происходит, когда существует несоответствие между именем пакета в классе домена (или другим артефактом) и папкой, в которой находится файл.

Если вы хотите Role класс, чтобы быть в com.mypackage пакет, убедитесь, что файл находится в grails-app/domain/com/mypackage/Role.groovy, Имена также чувствительны к регистру, поэтому убедитесь, что имена папок и пакетов тоже совпадают. Кроме того, вы, вероятно, этого не делали, но я видел, как люди совершали ошибки, такие как создание каталога "com.mypackage", помещение файла в grails-app/domain/com.mypackage/Role.groovy, Любая из этих проблем приведет к несоответствию, которое вы видите.

Другие вопросы по тегам