Grails / Groovy - Domain Object - Map of its Properties
How can I get a map of the key/values of only the user-defined properties on one of my domain objects?
Problem is if I do this myself, I get my properties plus class, me开发者_如何学GotaClass, constraints, closures, etc...
I assume Grails can do this fairly easily because it is done at some level in the scaffold code right? How can I do this myself?
Try this
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
}
It also works if you use alex.metaClass.surname = 'such'
. This property will be displayed in the each loop
This is an old question, but I just ran across this requirement and found another solution that is worth answering here for others who come across this thread. I have put together an example based on that thread:
Sample 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" ]
}
}
}
Test Class
class Test {
static main(args) {
// test bean properties
SampleBean sb = new SampleBean(1,'john','doe','jd@gmail.com')
println sb.asMap()
}
}
The SampleBean
I put a variety of fields to show that it works, this is the output of the println:
[id:1, firstName:john, lastName:doe, email:jd@gmail.com]
I think the best way is to use .properties on a domain object to get map of the fields in grails , tested in grails 2.1
class Person{
String firstName
String lastName
}
def person=new Person()
person.firstName="spider"
person.lastName="man"
def personMap=person.properties
Grails Domain Objects
You can use Grails Gorm's getPersistentProperties()
, if you are not including any transient properties on your map.
def domainProperties = [:]
YourDomain.gormPersistentEntity.persistentProperties.each { prop ->
domainProperties.put(prop.name, yourDomainObject."$prop.name")
}
If you want to include transient properties, just write another loop on the property transients
:
YourDomain.transients.each { propName ->
domainProperties.put(propName, yourDomainObject."$propName")
}
Read my answer here for some more detail on persistentProperties
.
Groovy Objects
For simple POGOs, as others pointed out in their answers, the following does the job:
def excludes = ['class']
def domainProperties = yourPogo.properties.findAll { it.key !in excludes }
or
Map map = [:]
yourPogo.class.declaredFields.each {
if (!it.synthetic) map.put(it.name, yourPogo."$it.name")
}
You can get the best alternative that suits your needs and implement it on a method in a trait
to be inherited or create a utility method that accepts the object as argument.
精彩评论