Grails使用gstring访问嵌套字段

Grails使用gstring访问嵌套字段,grails,groovy,gstring,Grails,Groovy,Gstring,我试图使用gstring访问嵌套字段,但它抛出异常groovy.lang.MissingPropertyException 我有两节课 Class Person{ Address address } Class Address{ String city } 在我的代码中的某个地方 def person = Person.get(1) def field = "address.city" def city = person."${field}" 我试图从person获取city的代码

我试图使用gstring访问嵌套字段,但它抛出异常groovy.lang.MissingPropertyException

我有两节课

Class Person{
   Address address
}
Class Address{
  String city
}
在我的代码中的某个地方

def person = Person.get(1)
def field = "address.city"
def city = person."${field}"
我试图从person获取city的代码是抛出groovy.lang.MissingPropertyException

如果我尝试使用gstring获取一个直接属性,它可以工作,但是上面给出的代码不起作用


有什么帮助吗?

我认为问题在于访问子属性的点运算符

这项工作:

class Person{
   String address
}

def person = new Person(address:'Madrid')

def field = 'address'
assert 'Madrid' == person."${field}"
class Person{
   Address address
}

class Address {
  String city
}

def person = new Person(address: new Address(city: 'Madrid'))

def field = 'address'
def subField = 'city'
assert 'Madrid' == person."${field}"."${subField}"

这项工作:

class Person{
   String address
}

def person = new Person(address:'Madrid')

def field = 'address'
assert 'Madrid' == person."${field}"
class Person{
   Address address
}

class Address {
  String city
}

def person = new Person(address: new Address(city: 'Madrid'))

def field = 'address'
def subField = 'city'
assert 'Madrid' == person."${field}"."${subField}"

您在这里所做的是尝试通过名称
address.city
访问属性,该名称等于
person.“address.city”
,这意味着此处的点被视为属性名称的一部分,而不是您期望的访问分隔符。以下代码应解析您的属性:

def city = field.tokenize('.').inject(person) {v, k -> v."$k"}

这是一个非常优雅的解决方案!如何设置通过这种方式检索的嵌套属性的值?@user1200125通过这种方式检索的不是属性引用,而是它的值,所以没有什么可设置的值。知道如何检索属性/字段来修改其值吗?@user1200125不,我已经离开Grooving一年多了。但你肯定可以提出一个专门的问题。我认为你在寻找的是反射。虽然我同意Nikita Volkov的另一个答案,def city=field.tokenize('.').inject(person){v,k->v.“$k”},是一个非常优雅的答案,但我更喜欢这个答案的简单性和可读性。乍一看,这个答案很清楚。