【问题标题】:Grails domain validator not workingGrails 域验证器不工作
【发布时间】:2015-01-20 22:20:57
【问题描述】:

我的域中有以下字段

@BindingFormat('mm/dd/yyyy hh:mm a')
Date advertiseDate

@BindingFormat('mm/dd/yyyy hh:mm a')
Date closeDate

@BindingFormat('mm/dd/yyyy hh:mm a')
Date letDate

closeDate validator: { value, contract -> value >= contract.advertiseDate }      
letDate validator: { value, contract -> value >= contract.closeDate }

messages.properties 文件中有验证错误

project.Contract.closeDate.validator.error = Close Date cannot be before Advertise Date
project.Contract.letDate.validator.error = Let Date cannot be before Close Date

由于某种原因,我的验证器似乎无法正常工作。我没有收到任何错误 我只是没有收到我的验证错误。

这些验证在我使用只有mm/dd/yyyy 格式的jquery datepicker 时有效,但是一旦我切换到mm/dd/yyyy hh:mm a 格式的jquery datetimepicker 时,它就可以正常工作了。我所做的唯一其他更改是在 gsp 上包含一种格式,如下所示

value="${formatDate(format:"MM/dd/yyyy hh:mm a", date:contractInstance?.letDate)}"  

任何帮助或想法将不胜感激。

【问题讨论】:

  • 首先要确认他们是否被调用。这样您就可以知道是验证器中的逻辑有问题,还是根本停止调用验证器表单的问题。我建议在验证器中添加一个 println 以在日志中查看它是否被调用。比如:println('In closeDate validator');
  • 您应该使用大写的 M 表示月份:@BindingFormat('MM/dd/yyyy hh:mm a')

标签: grails grails-domain-class


【解决方案1】:

您需要validator 中的以下逻辑

closeDate validator: { value, contract -> 
    if ( value < contract.advertiseDate ) return ['invalid']
}      
letDate validator: { value, contract -> 
    if ( value < contract.closeDate ) return ['invalid']
}

//messages.properties
project.contract.closeDate.invalid = Close Date cannot be before Advertise Date
project.contract.letDate.invalid = Let Date cannot be before Close Date

返回密钥将用于查找该特定字段的消息。

注意上面对消息键的更改,在无效情况下匹配返回键。我假设project 是消息键中的包名,并且日期使用@BindingFormat 正确绑定。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多