Я думаю, вам здесь не повезло. Из того, что я могу сказать, разработчики Grails не хотят, чтобы вы изменяли ограничения во время выполнения. Ограничения хранятся в
org.codehaus.groovy.grails.commons.DefaultGrailsDomainClass
где сами ограничения хранятся в виде частной карты с единственным средством доступа
public Map getConstrainedProperties()
{
return Collections.unmodifiableMap(this.constraints);
}
Закрытие ограничений обрабатывается org.codehaus.groovy.grails.validation.ConstrainedPropertyBuilder.
Очевидно, что вы можете написать свой собственный класс DomainClass, который имеет модифицируемый объект ограничений, и вставить его в инициализацию на основе Spring, но я подозреваю, что это путь, по которому вы, возможно, не захотите идти.
Дополнительная мысль - я не знаю конкретного примера для ограничения zipCode, но многие из ограничений применяют ограничения для столбцов базы данных, поэтому их добавление во время выполнения может, вероятно, привести к странному поведению. Я думаю, что с помощью пользовательских валидаторов ограничений было бы легче избежать странных ошибок в базе данных.
Обновление
Глядя на это еще немного, я обнаружил, что DefaultGrailsDomainClass имеет метод refreshConstraints (), который, кажется, заставляет переоценивать закрытие ограничений, хотя я все еще не уверен, можете ли вы изменить само закрытие или почему эта функциональность существует в первое место.
В версии 1.2 в Grails добавлены общие ограничения. Интересно, можно ли создать общее ограничение zipCode, как-то изменить его, а затем вызвать обновление?