【问题标题】:Grails cross-class validationGrails 跨类验证
【发布时间】:2014-07-28 12:52:07
【问题描述】:

我尝试验证来自两个不同对象的两个语言字段。我找到了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}

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

【问题讨论】:

  • 你能用有问题的代码构建一个简单的应用程序并发布到 github 上,以便我们帮助你调试吗?
  • 我在 git 上上传了我的示例:github.com/Spooney/GrailsTest.git提前致谢

标签: validation grails cross-validation


【解决方案1】:

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

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"          
  }       
}

希望这会有所帮助。

【讨论】:

  • 感谢您的回复,但也没有用。我用域类更新了我的问题。
  • 您没有按照应有的方式将参数传递给验证器。看你需要怎么用validator: { val, obj ->不然obj就没意义了。
  • 我试过你的新版本。现在我得到一个内部服务器错误。
【解决方案2】:

试试这个代码

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']
                }
            }
}

【讨论】:

  • 我已经更新了我的答案,并添加了空白和可为空,试试这个并告诉我这是否有效。
  • 您可以搜索其他解决方案。符合您的要求。
猜你喜欢
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多