Grails:我可以将验证器应用于仅创建(不更新/编辑)

Mik*_*key 7 mysql grails calendar grails-validation

我有一个域类,需要在其一个字段中创建日期之后有一个日期.

class myClass {
  Date startDate
  String iAmGonnaChangeThisInSeveralDays
  static constraints = {
    iAmGonnaChangeThisInSeveralDays(nullable:true)
    startDate(validator:{
        def now = new Date()
        def roundedDay = DateUtils.round(now, Calendar.DATE)
        def checkAgainst
        if(roundedDay>now){
            Calendar cal = Calendar.getInstance();
            cal.setTime(roundedDay);
            cal.add(Calendar.DAY_OF_YEAR, -1); // <--
            checkAgainst = cal.getTime();
        }
        else checkAgainst = roundedDay

        return (it >= checkAgainst)
    })
  }
}
Run Code Online (Sandbox Code Playgroud)

所以几天后,当我只更改字符串并调用save时,保存失败,因为验证器正在重新检查日期,现在它已经过去了.我是否可以将验证器设置为仅在创建时触发,或者是否可以通过某种方式更改它以检测我们是否正在创建或编辑/更新?

@Rob H我不完全确定如何使用你的答案.我有以下代码导致此错误:

myInstance.iAmGonnaChangeThisInSeveralDays = "nachos"
myInstance.save()
if(myInstance.hasErrors()){
  println "This keeps happening because of the stupid date problem"
}
Run Code Online (Sandbox Code Playgroud)

Bur*_*ith 13

您可以检查是否将id其设置为是否为新的非持久性实例或现有持久性实例的指示符:

startDate(validator:{ date, obj ->
   if (obj.id) {
      // don't check existing instances
      return
   }
   def now = new Date()
   ...
}
Run Code Online (Sandbox Code Playgroud)