Groovy / Grails: улучшение статического замыкания - PullRequest
2 голосов
/ 15 ноября 2009

Я ищу способ изменить / изменить существующее замыкание. Однако я не хочу перезаписывать это; вместо этого я хотел бы улучшить его.

Вот краткий пример. Допустим, у нас есть объект Address:

class Address {
    String street
    String city
    String state
    String zipCode

    static constraints = {
        street( nullable:true )
        city( blank:false )
        state( size:2..2 )
    }
}

Это был бы хороший пример, потому что это также допустимый объект домена Grails. Что я хочу сделать, это добавить еще одно ограничение во время выполнения / динамически в класс Address:

class Address {
    String street
    String city
    String state
    String zipCode

    static constraints = {
        street( nullable: true )
        city( blank: false )
        state( size: 2..2 )
        zipCode( size: 5..6 )
    }
}

Обратите внимание, что новое ограничение zipCode? Я понимаю, что могу изменить ограничения все вместе, переопределив это через metaClass; однако цель здесь не в том, чтобы кого-то обидеть, поэтому я просто хочу добавить к существующее закрытие.

Ответы [ 3 ]

3 голосов
/ 19 апреля 2012

Вы действительно можете изменить ограничения во время выполнения.

ConstrainedProperty constrainedProperty = Address.constraints.zipCode
constrainedProperty.setSize(5..6)
2 голосов
/ 15 ноября 2009

Я думаю, вам здесь не повезло. Из того, что я могу сказать, разработчики 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, как-то изменить его, а затем вызвать обновление?

0 голосов
/ 28 июля 2013

Думаю, что, может быть, я не понимаю, так как вы могли бы также рассматривать это как проверку уровня домена ... не так ли?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...