Получение списка постоянных свойств GORM для домена - PullRequest
30 голосов
/ 29 декабря 2010

Каков наилучший / самый простой способ получить список постоянных свойств, связанных с данным объектом домена 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
        }
    }

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

Ответы [ 3 ]

47 голосов
/ 29 декабря 2010

Попробуйте это:

import org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
...
def d = new DefaultGrailsDomainClass(YourDomain.class)
d.persistentProperties

Вот ссылка на Grails API для GrailsDomainClass (это ссылка на более старую версию; я не смог найти более новую версию после нескольких быстрых поисков). У него есть getPersistentProperties() (используется во фрагменте кода выше). Вы можете просмотреть документацию API, чтобы узнать, какие другие методы могут быть вам полезны.

Если вам нужен пример, выполните grails install-templates, а затем посмотрите на src/templates/scaffolding/create.gsp. Там есть блок, где он перебирает свойства постоянного домена.

13 голосов
/ 16 января 2014

Теперь (начиная с Grails 2.x) вам даже не нужно создавать экземпляр new DefaultGrailsDomainClass(...) и избегать ненужного выполнения кода. Все объекты класса домена имеют внедренное свойство domainClass:

def domainObject = new YourDomain()
domainObject.domainClass.persistentProperties

Или, если у вас нет объекта класса домена, вы можете получить DefaultGrailsDomainClass из контекста приложения по имени класса домена - каждый класс домена имеет класс DefaultGrailsDomainClass, зарегистрированный как bean-компонент Spring. Таким образом, вы можете использовать, например, Holders (при условии, что ваше имя класса домена 'Foo'):

def defaultGrailsDomainClass = Holders.applicationContext.getBean("FooDomainClass")
defaultGrailsDomainClass.persistentProperties
6 голосов
/ 15 августа 2017

Начиная с grails 3.3.0

Весь код, который использует классы GrailsDomainClass или GrailsDomainClassProperty, должен быть переписан для использования контекста сопоставления api.

Чтобы получитьначал, введите боб grailsDomainClassMappingContext.Для получения дополнительной информации о MappingContext, PersistentEntity (GrailsDomainClass) и PersistentProperty (GrailsDomainClassProperty)

см., Например:

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
        }
    }
}

.помогает кому-то.

...