【问题标题】:Grails validation no Constraints blockGrails 验证无约束块
【发布时间】:2013-03-14 14:26:26
【问题描述】:

在 Grails 中约束验证域对象的常用方法是在域对象中定义一个静态约束闭包,之后可以调用 myObject.validate()。

是否有可能以某种方式将应验证的内容传递给 validate 调用而不定义约束块?

我想这可以通过 Spring 验证器实例来完成,但有没有更简单的方法让您仍然拥有 Grails 的“好东西”(最大、电子邮件等)?

【问题讨论】:

    标签: validation grails


    【解决方案1】:

    您可以将字段列表传递给.validate(["fieldA", "fieldB"]),它只会验证这些字段。您仍然需要一个约束块来定义这些字段的约束。

    来自 Grails 用户指南: "validate 方法接受一个可选的 List 参数,该参数包含要验证的属性的名称。当指定名称列表时,只有这些属性将被验证。"

    回复@eugene82:

    @Validateable
    class MyDomainValidator {
    String email
    static constraints = {
    email(email:true)
    }
    }
    
    MyDomain m = new MyDomain()...
    MyDomainValidator mv = new MyDomainValidator()..
    mv.properties = m.properties
    mv.validate()
    

    【讨论】:

    • 那我不明白你的问题
    • 好吧,我的问题是:“没有约束块” - 即使在主题中也是如此。你建议我使用约束块.. 所以.. 去图 :)
    • 我的回答确实回答了你的问题,因为如果你想使用内置验证,你需要一个约束块。期间。
    • 很好的论证。期间!
    【解决方案2】:

    我想像这样的方法:创建一个@Validateable groovy 类,其中包含静态约束以及您需要的任何 Grails 好东西。让它像您的域一样拥有所有字段(例如,通过扩展域),并提供一种将所有字段从域实例复制到该对象的新实例的方法,例如使用构造函数。比在该课程上致电validate()

    class MyDomain {
        String email
        MyDomain() {}
        MyDomain(email) {
            email = this.email
        }
    }
    @Validateable
    class MyDomainCustomValidator extends MyDomain {
        MyDomainValidator() {}
        MyDomainValidator(domain) {
            super(domain.email)
        }
        static constraints = {
            email email: true
        }
    }
    
    def d = new MyDomain('e@mail.com')
    new MyDomainCustomValidator(d).validate()
    

    【讨论】:

    • 嗯.. 这不是我想要的。我宁愿能够做类似 d.validate(thisConstraint) 的事情。不知道有没有可能……
    • @James,为什么?是否有另一种方法可以将在该域之外定义的任何 Grails 约束应用于域?
    猜你喜欢
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多