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
;然而,这里的目标并不是在一个过程中伤害任何人,因此我只想将加到现有的关闭中。
我想你可能在这里运气不好。从我所知道的,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中添加共享的限制 - 我不知道你可以创建一个共享的邮政编码约束,在某种程度上修改它,然后调用刷新。
我同意,域名限制不应该是可修改的,一旦应用程序启动并运行,但为了插件的目的,我认为它们应该是开放的。 '共享约束条件'将要求用户手动*将属性输入到静态块中。 无论如何感谢您挖掘到 – tolitius 2009-11-16 09:04:35
发现此线程可能在这里相关。 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)
想一想,也许我不理解,因为你也可以看看只做域名级别验证......你可不可以吗?
你不只是说:“我,什么是精细结构看你!”赞美一个结构?还是你必须使用更详细的描述? – 2009-11-15 04:49:06
是的,刚刚尝试过。尽管关闭非常高兴,但它仍然缺少一个“zipCode”... – tolitius 2009-11-15 04:59:52