Groovy/Grails:增强静态关闭

问题描述:

我正在寻找一种方法来修改/更改现有的闭包。但是,我不想覆盖它。相反,我想提高它。Groovy/Grails:增强静态关闭

这是一个简单的例子。假设我们有一个地址对象:

class Address { 
    String street 
    String city 
    String state 
    String zipCode 

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

这将是一个很好的例子,因为它也是一个有效的Grails域对象。 我所希望做的是在运行时/动态添加另一个约束类地址:

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;然而,这里的目标并不是在一个过程中伤害任何人,因此我只想将加到现有的关闭中。

+0

你不只是说:“我,什么是精细结构看你!”赞美一个结构?还是你必须使用更详细的描述? – 2009-11-15 04:49:06

+0

是的,刚刚尝试过。尽管关闭非常高兴,但它仍然缺少一个“zipCode”... – tolitius 2009-11-15 04:59:52

我想你可能在这里运气不好。从我所知道的,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中添加共享的限制 - 我不知道你可以创建一个共享的邮政编码约束,在某种程度上修改它,然后调用刷新。

+0

我同意,域名限制不应该是可修改的,一旦应用程序启动并运行,但为了插件的目的,我认为它们应该是开放的。 '共享约束条件'将要求用户手动*将属性输入到静态块中。 无论如何感谢您挖掘到 – tolitius 2009-11-16 09:04:35

+0

发现此线程可能在这里相关。 http://old.nabble.com/Is-it-possible-to-inject-constraints-dynamically-on-domain-classes--td24489941.html – 2009-11-18 02:11:06

您确实可以在运行时更改约束条件。

ConstrainedProperty constrainedProperty = Address.constraints.zipCode 
constrainedProperty.setSize(5..6) 

想一想,也许我不理解,因为你也可以看看只做域名级别验证......你可不可以吗?