Grails / Groovy - 域对象 - 其属性的映射

时间:2011-06-14 12:11:37

标签: reflection grails groovy dns metaprogramming

如何在我的某个域对象上获取仅用户定义属性的键/值的映射?

问题是,如果我自己这样做,我得到我的属性加上类,metaClass,约束,闭包等......

我认为Grails可以相当容易地做到这一点,因为它在脚手架代码中的某个级别完成了吗?我怎么能自己做?

3 个答案:

答案 0 :(得分:10)

试试这个

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',它也有效。此属性将显示在每个循环中

答案 1 :(得分:3)

这是一个老问题,但我只是遇到了这个要求,发现another solution值得在这里为遇到这个帖子的其他人回答。我已经根据该主题汇总了一个例子:

示例Bean

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]

答案 2 :(得分:0)

我认为最好的方法是在域对象上使用.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