如何仅获取一个域对象上用户定义属性的键/值的映射?
问题是,如果我自己做这件事,我会得到我的属性加类、元类、约束、闭包等…
我认为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
中的方法上实现它,或者创建一个接受对象作为参数的实用程序方法。