Использование XML для динамических ограничений в Grails - PullRequest
0 голосов
/ 05 июля 2010

Я пытаюсь динамически заполнить static constraint ={} во время выполнения. Есть ли способ сделать это. Пример кода:

Нормальное утверждение:

static constraint = {
    lastName(blank:false, maxSize: 100)
}

Что я пытаюсь сделать:

static constraint = {

    call to an XMLSlurper that returns a HashMap of lastName as a key and (blank: false, maxSize: 100) as a value.  // This part works.

    have the HashMap executed as if it where hard coded information to validate the fields. //This part does not work.

}

Надеюсь, это достаточно хорошо объясняет мою проблему.

Ответы [ 2 ]

1 голос
/ 05 июля 2010

Это возможно, но не так, как вы пытаетесь это сделать.Ограничения для класса GORM загружаются с использованием GrailsHibernateDomainClass .Когда класс загружен, оценивается методvaluConstraints и ограничения статического свойства.Чтобы посмотреть, как они оцениваются, вы можете посмотреть на методvaluConstraints в GrailsDomainConfigurationUtil .

Если вы хотите добавить свои собственные ограничения из альтернативного источника, вам нужно будет изменить класс домена самостоятельно,Лучший способ сделать это в плагине.Сначала прочитайте документацию по плагину , и ваша точка входа - метод doWithSpring:

def doWithSpring { -> 
  application.getArtefacts(DomainClassArtefactHandler.TYPE).each { domainClass ->
    def myConstraints = getConstraintsFromXml() /* Create a Map<ConstrainedProperty> from your XML */
    domainClass.constrainedProperties.putAll myConstraints
  }
}
0 голосов
/ 06 июля 2010

Глядя на GrailsDomainConfigurationUtil, вы можете видеть, что карта ограничений строится из свойства статических ограничений класса домена с использованием ConstrainedPropertyBuilder. Конечно, вы можете заполнить карту ограничений, динамически вызывая методы компоновщика, используя карту, созданную из XML.

static constraints = {
  def fromXml = [lastName: [blank:false, maxSize: 100]]
  fromXml.each { property, constraints ->
    invokeMethod (property, constraints)
  }
}

Это может подойти, если вам нужны только ограничения на основе XML в одном доменном классе, в противном случае более общий подход, предложенный Эриком, вероятно, лучше, например схема именования файлов XML и, таким образом, экстраполяция идеи соглашения на конфигурацию.

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