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



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

问题是,如果我自己做这件事,我会得到我的属性加类、元类、约束、闭包等…

我认为Grails可以很容易地做到这一点,因为它是在脚手架代码的某个级别上完成的,对吧?我自己怎么能做到这一点?

试试这个

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

这是一个老问题,但我刚刚遇到了这个需求,并在这里找到了另一个值得其他遇到这个问题的人回答的解决方案。我在这个线程的基础上举了一个例子:

样品豆

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]

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

Grails域对象

如果在地图上不包含任何瞬态属性,则可以使用Grails Gorm的getPersistentProperties()

def domainProperties = [:]
YourDomain.gormPersistentEntity.persistentProperties.each { prop ->
    domainProperties.put(prop.name, yourDomainObject."$prop.name")
}

如果您想包含瞬态属性,只需在属性transients:上写另一个循环

YourDomain.transients.each { propName ->
    domainProperties.put(propName, yourDomainObject."$propName")
}

在这里阅读我的答案,了解有关persistentProperties的更多详细信息。


Groovy对象

对于简单的POGO,正如其他人在回答中指出的那样,以下内容起作用:

def excludes = ['class']
def domainProperties = yourPogo.properties.findAll { it.key !in excludes }

Map map = [:]
yourPogo.class.declaredFields.each {
   if (!it.synthetic) map.put(it.name, yourPogo."$it.name")
}

您可以获得适合您需求的最佳替代方案,并在要继承的trait中的方法上实现它,或者创建一个接受对象作为参数的实用程序方法。

相关内容

  • 没有找到相关文章

最新更新