2010-11-02 57 views
8

我是grails和groovy的新手。我有一个具有开始和结束日期的Project域类。我想要放入一个约束,指定结束日期需要大于开始日期(然后,项目的另一个子对象需要使用父项目的日期来验证其startdate和enddate)。这是可能的最小约束,还是我必须把它放在其他地方?唯一约束确实允许以这种方式链接两个属性,希望最小/最大约束允许这样做。 我试图Grails最小限制日期验证

startDate(blank:false) 
endDate(blank:false, min:'startDate') 

它抛出一个错误说属性的startDate上没有项目

+0

我的答案是假设'endDate'被定义为'java.util.Date'。它是否正确?如果不是,请说明它是什么,我会相应地更新我的答案。 – 2010-11-02 19:08:20

+0

是它的正常日期。希望最小限制也适用于此......感谢答案:)所以,min只适用于整数,对吧? – 2010-11-02 19:28:24

+0

那么,'min'可以很好地应用于'日期'值。然而,我不相信你可以在'min'的约束定义中使用动态值(即另一个字段值),因为'constraints'是一个静态闭包。不过,你可以做'endDate(min:new Date())',没有问题。 – 2010-11-02 19:32:24

回答

13

尝试使用自定义的验证:

static constraints = { 
    endDate(validator: { val, obj -> 
     val?.after(obj.startDate) 
    }) 
} 

val的领域和obj的价值是对被验证对象的引用。闭包可以包含任何您需要的逻辑,所以您可以按照您在问题中描述的方式扩展验证(通过访问使用obj引用的子对象)。

自定义验证器非常灵活。看看the documentation。理想情况下,您需要返回自定义消息;如何做到这一点,也可以在上面链接的文档中找到。