Получение списка постоянных свойств GORM для домена
Какой лучший/самый простой способ получить список постоянных свойств, связанных с данным объектом GORM? Я могу получить список всех свойств, но этот список содержит непостоянные поля, такие как class
и constraints
.
В настоящее время я использую это и отфильтровываю список свойств nonPersistent
с помощью списка, который я создал:
def nonPersistent = ["log", "class", "constraints", "properties", "errors", "mapping", "metaClass"]
def newMap = [:]
domainObject.getProperties().each { property ->
if (!nonPersistent.contains(property.key)) {
newMap.put property.key, property.value
}
}
Кажется, что должен быть лучший способ получить только постоянные свойства.
Ответы
Ответ 1
Попробуйте следующее:
import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
...
def d = new DefaultGrailsDomainClass(YourDomain.class)
d.persistentProperties
Здесь ссылка на API Grails для GrailsDomainClass (это ссылка на более старую версию, я не мог найти более новую версию после некоторых быстрых поисков). Он получил getPersistentProperties()
(используется в фрагменте кода выше). Вы можете просмотреть документацию API, чтобы узнать, какие другие методы могут вам пригодиться.
Если вам нужен пример, выполните grails install-templates
, а затем просмотрите src/templates/scaffolding/create.gsp
. Там есть блок, где он выполняет итерацию по свойствам постоянных доменов.
Ответ 2
Теперь (strartsing Grails 2.x) вам даже не нужно создавать экземпляры new DefaultGrailsDomainClass(...)
и избегать ненужных исполнений кода. Все объекты класса домена ввели свойство domainClass
:
def domainObject = new YourDomain()
domainObject.domainClass.persistentProperties
Или, если у вас нет объекта класса домена, вы можете получить DefaultGrailsDomainClass
из контекста приложения по имени класса домена - каждый класс домена имеет DefaultGrailsDomainClass, зарегистрированный как Spring bean. Таким образом, вы можете использовать, например, Holders
(при условии, что ваше имя класса домена "Foo" ):
def defaultGrailsDomainClass = Holders.applicationContext.getBean("FooDomainClass")
defaultGrailsDomainClass.persistentProperties
Ответ 3
Как grails 3.3.0
Весь код, который использует классы GrailsDomainClass
или GrailsDomainClassProperty
, должен быть переписан для использования контекста сопоставления api.
Чтобы начать, введите grailsDomainClassMappingContext
bean. Дополнительную информацию о MappingContext
, PersistentEntity
(GrailsDomainClass) и PersistentProperty
(GrailsDomainClassProperty) см. В документации api
Например:
class MyService {
def grailsDomainClassMappingContext //inject
def accessDomainProperties(Class clazz) {
PersistentEntity entityClass = grailsDomainClassMappingContext.getPersistentEntity(clazz.name)
List<PersistentProperty> persistentPropertyList = entityClass.persistentProperties
persistentPropertyList.each { property ->
println property.name
}
}
}
Надеюсь, это поможет кому-то.