Подтвердить что ты не робот

Получение списка постоянных свойств 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
        }
    }

Кажется, что должен быть лучший способ получить только постоянные свойства.

4b9b3361

Ответ 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
        }
    }
}

Надеюсь, это поможет кому-то.