Grails обращается к вложенным полям, используя gstrings - PullRequest
3 голосов
/ 16 октября 2011

Я пытаюсь получить доступ к вложенному полю, используя 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}"

Строка, где я пытаюсь получить город от человека, выбрасывает groovy.lang.MissingPropertyException

Если я пытаюсь получить прямое свойство, используя gstring, оно работает, но приведенный выше код не работает.

Любая помощь?

Ответы [ 2 ]

11 голосов
/ 16 октября 2011

Здесь вы пытаетесь получить доступ к свойству по имени address.city, которое равно person."address.city", что означает, что точка здесь рассматривается как часть имени свойства, а не как разделитель доступа, как вы ожидаете.Следующий код должен разрешить вашу собственность:

def city = field.tokenize('.').inject(person) {v, k -> v."$k"}
3 голосов
/ 16 октября 2011

Я думаю, что проблема в точечном операторе для доступа к вложенному объекту.

Это работает:

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}"
...