Grails / Groovy - Доменный объект - Карта его свойств - PullRequest
7 голосов
/ 14 июня 2011

Как я могу получить карту ключей / значений только определенных пользователем свойств на одном из объектов моего домена?

Проблема в том, что если я делаю это сам, я получаю свои свойства плюс класс, метакласс, ограничения, замыкания и т. Д. *

Я предполагаю, что Grails может сделать это довольно легко, потому что это делается на каком-то уровне в коде скаффолда, верно? Как я могу сделать это сам?

Ответы [ 3 ]

10 голосов
/ 15 июня 2011

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

class Person{
    String name
    String address
}

def filtered = ['class', 'active', 'metaClass']

def alex = new Person(name:'alex', address:'my home')

def props = alex.properties.collect{it}.findAll{!filtered.contains(it.key)}

props.each{
    println it
}

Это также работает, если вы используете alex.metaClass.surname = 'such'. Это свойство будет отображаться в каждом цикле

3 голосов
/ 17 сентября 2015

Это старый вопрос, но я просто наткнулся на это требование и нашел другое решение , на которое стоит ответить здесь для других, кто сталкивался с этой веткой. Я собрал пример, основанный на этой теме:

Образец бобов

class SampleBean {

    long id
    private String firstName
    String lastName
    def email

    Map asMap() {
        this.class.declaredFields.findAll { !it.synthetic }.collectEntries {
            [ (it.name):this."$it.name" ]
        }
    }
}

Тестовый класс

class Test {

    static main(args) {
        // test bean properties
        SampleBean sb = new SampleBean(1,'john','doe','jd@gmail.com')

        println sb.asMap()
    }

}

SampleBean Я поместил множество полей, чтобы показать, что он работает, это вывод println:

[id:1, firstName:john, lastName:doe, email:jd@gmail.com]
0 голосов
/ 13 ноября 2018

Я думаю, что лучший способ - использовать .properties на доменном объекте, чтобы получить карту полей в Grails, протестированную в Grails 2.1

class Person{
String firstName
String lastName

} 
def person=new Person()
person.firstName="spider"
person.lastName="man"
def personMap=person.properties 
...