Для меня имеет смысл, что validate
нужно будет вызвать, прежде чем спрашивать у объекта, является ли он hasErrors
(или save
для надлежащих доменных объектов, который вызывает validate
под прикрытием). Проверить в этом контексте означает «проверить, является ли этот объект допустимым, и указать на наличие ошибок, если нет».
В качестве альтернативы реализация GORM должна будет вызывать validate
каждый раз, когда в объект вносятся какие-либо изменения, что для меня было бы менее желательным поведением, поскольку это может включать в себя много работы, выполняемой часто и излишне (некоторые из этих ограничений может потребовать много работы).
В начале раздела 7.2 довольно четко сказано: «Для проверки класса домена вы можете вызвать метод validate в любом случае». В нем также говорится, что «в Grails, по сути, есть 2 этапа проверки, первый этап - это привязка данных, которая происходит, когда вы привязываете параметры запроса к экземпляру, например ... В этот момент у вас уже могут быть ошибки в свойстве ошибок из-за преобразование типов (например, преобразование строк в даты). Вы можете проверить их и получить исходное входное значение с помощью API ошибок. ... Второй этап проверки происходит при вызове проверки или сохранения. Именно тогда Grails будет проверять границу значения снова возвращает ограничения, которые вы определили. "
Документация для hasErrors
также упоминает об этом. Вы можете получить к нему доступ, найдя вызов метода в рамке навигации слева, когда находитесь на сайте документации . Я всегда рекомендовал бы ознакомиться с этими и более описательными страницами руководства пользователя, поскольку они часто дают немного больше деталей.
Вот страница для validate
метода тоже.
У меня никогда не было проблем с непосредственным вызовом validate
- это очень ясно для меня, и я могу выбрать момент, когда вся работа будет выполнена, и я готов к проверке. Я не вижу возможности изменить это поведение где-либо, но если вы хотите, чтобы validate
вызывался автоматически или при определенных условиях, вы могли бы использовать магию метапрограммирования Groovy, добавив invokeMethod
в класс и получить его. Позвоните validate
, прежде чем переходить на определенные вызовы. Посмотрите здесь и здесь .
(Не уверен, что я рекомендовал бы это, хотя! И имейте в виду, что ваш класс теперь будет зависеть от того, будет ли он использоваться в рамках валидации GORM, так как этот метод validate
в противном случае может не существовать).