Хотя "глубокая проверка" в настоящее время не документирована для методов 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() }
}
}
}