Grails跨类验证

时间:2014-06-07 09:00:08

标签: validation grails cross-validation

我尝试从两个不同的objekts验证两个语言字段。我找到Grails Validation,所以我创建了:

class Test {
Title title
Summary summary

static contraints ={
      title validator: { val, obj ->
      if (obj.title.getLanguage().equals(obj.summary.getLanguage())) println "same language"
    }
  }
}

域名摘要

class Summary{
String language }

和域名

class Title{
String language}

但在我看来验证器没有反应。提前谢谢。

2 个答案:

答案 0 :(得分:0)

如果没有看到您网域的其余部分,我无法确定具体细节,但却遗漏了一些重要内容。您缺少对要验证的实例的引用。使用自定义验证时,有两个可选参数传递到验证闭包中。一个是要验证的类的实例,另一个是当前属性的值。所以,给定一个这样的域:

class MyPerson {
  String name
  String nickName

  static constraints = {
    name(nullable: false, blank: false)
    nickName(validator: {val, obj ->
      if (obj.name == val) return false // ensure the name and nickname do not equal one another
      return true
    })
  }
}

因此,在上面的示例中,自定义验证可确保名称和昵称彼此不匹配。请注意使用obj.name来引用实例的另一个属性。这是你试图做的事情的关键。

在您的情况下,您的验证可能如下所示:

static contraints ={
  title validator: { val, obj ->
    if (obj.title.getLanguage().equals(obj.summary.getLanguage())) println "same language"          
  }       
}

希望这有帮助。

答案 1 :(得分:0)

试试此代码

static constraints = {    
  title blank: false, nullable: false,validator:{ value , object -> 
             //get title object from database,based on your logic/requirement  
                 def title =  Title
             // get summary object from database,based on your logic/requirement 
                 def summary =  Summary          
                if (title.getLanguage().equals(summary.getLanguage()))
                     println "same language"          
                     return true
                } else {
                       //show message for validation failed.
                    return ['not.unique.validation','Langauge']
                }
            }
}