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
, Любая из этих проблем приведет к несоответствию, которое вы видите.