метод проверки Grails на объекте домена - PullRequest
4 голосов
/ 19 ноября 2010

Я написал очень простой контрольный пример и обнаружил, что Grails выполняет только поверхностную проверку, когда я вызываю validate для объекта домена.Могу ли я сделать глубокую проверку в Grails?Кто-нибудь может мне помочь?

class Person {
  Address address
}

class Address {
 String city
}

Когда я делаю новый Address().validate(), он возвращает ложь, но когда я делаю new Person(address: new Address()).validate, он возвращает истину.

1 Ответ

7 голосов
/ 19 ноября 2010

Хотя "глубокая проверка" в настоящее время не документирована для методов validate() и save(), в будущем будет (документзаявляет, что документация отсутствовала, и была актуальна для полного дерева 1.3.x).В документации по этим методам для параметра deepValidate затем будет указано :

@ deepValidate @ (необязательно) - определяет, следует ли проверять ассоциации экземпляра домена, т.е.проверки каскадов или нет.По умолчанию это @ true @ - для отключения каскадной проверки установлено значение @ false @.

Тесты, однако, показывают, что «глубокая проверка» не выполняется в любом из этихслучаи:

  • ассоциации один-к-одному
  • ассоциации один-ко-многим
    • связанные объекты, назначенные с использованием соответствующего установщика сопоставления
    • связанные объектыназначается с использованием соответствующего метода addTo*(..), например, person.addToAddresses(..)
  • с использованием обоих методов validate() и save(),
    • , а также с использованием обоих методовс явным параметром deepValidate: true

Аналогичные результаты были опубликованы в другом месте , классифицируя «отсутствие поведения» как «известную проблему»,Мои собственные комплексные тестовые примеры могут быть загружены отсюда .

Решение , наконец, заключается в том, чтобы вручную вызывать проверку для дочернего объекта:

class Person {
    Address primaryAddress
    static hasMany = [secondaryAddresses: Address]

    static constraints = { 
        primaryAddress validator: { 
            it?.validate()
        }
        secondaryAddresses validator: {
            it?.every { it?.validate() }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...