在Grails中使用XML进行动态约束

时间:2010-07-05 18:13:41

标签: xml grails groovy

我正在尝试在运行时动态填充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 个答案:

答案 0 :(得分:1)

这是可能的,但不是你尝试这样做的方式。使用GrailsHibernateDomainClass加载GORM类的约束。加载类时,将评估evaluateConstraints方法和静态属性约束。您可以查看GrailsDomainConfigurationUtil中的evaluateConstraints方法,了解它们的评估方式。

如果要从备用源添加自己的约束,则需要自己修改域类。最好的方法是插件。首先阅读plugin documentation,您的入口点是doWithSpring方法:

def doWithSpring { -> 
  application.getArtefacts(DomainClassArtefactHandler.TYPE).each { domainClass ->
    def myConstraints = getConstraintsFromXml() /* Create a Map<ConstrainedProperty> from your XML */
    domainClass.constrainedProperties.putAll myConstraints
  }
}

答案 1 :(得分:0)

查看GrailsDomainConfigurationUtil,您可以看到约束映射是使用ConstrainedPropertyBuilder从域类的静态约束属性构建的。您当然可以通过使用从XML中汲取的映射动态调用构建器方法来填充约束映射。

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

如果您只需要在单个域类中使用基于XML的约束,这可能是合适的,否则Eric建议的更通用的方法可能更好,允许例如XML文件的命名方案,从而推断约定优于配置的概念。