【问题标题】:Grails global constraintsGrails 全局约束
【发布时间】:2010-01-29 09:16:07
【问题描述】:

在 1.2 版中,Grails 引入了全局约束。我尝试将以下内容添加到 Config.groovy

grails.gorm.default = {

    constraints {
        notBlank(nullable:false, blank:false)
    }
}

然后在我的域类之一中使用它

static constraints = {
    email(email: true, unique: true, shared: 'notBlank')
}

但是当我用空电子邮件地址保存用户时,没有报错,为什么?

谢谢, 唐

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

    我从未尝试过创建全局约束,但我可以告诉您,如果您想将字段标记为非空白且不可为空,则根本不需要创建新约束,只需将其添加到您的领域类:

    static constraints = {
        email(blank:false)
    }
    

    当然,如果您期望保存时出现异常,您将不会得到一个 - 您需要在调用 save() 或 validate() 之后测试对象,如此域类中所示:

    class Contact {
        static constraints = {
            name(blank:false)
        }
        String name
    }
    

    及其测试用例:

    import grails.test.*
    
    class ContactTests extends GrailsUnitTestCase {
        protected void setUp() {
            super.setUp()
        }
    
        protected void tearDown() {
            super.tearDown()
        }
    
        void testNameConstraintNotNullable() {
            mockDomain Contact
            def contact = new Contact()
            contact.save()
            assertTrue contact.hasErrors()
            assertEquals "nullable", contact.errors["name"]
        }
    }
    

    如果您确实希望保存时出现异常,可以在 Config.groovy 中添加此设置:

    grails.gorm.save.failOnError = true
    

    我发现它在开发中非常有用。

    HTH

    PS

    要使用您定义的约束,您需要将其添加到您的域类:

    static constraints = {
        email(shared:"myConstraintName")
    }
    

    但请注意,您不能像测试内置测试那样在单元测试中测试约束,因为不会读取配置。

    【讨论】:

    • 感谢您提供有关无法对全局约束进行单元测试的提示 - 不知道。顺便说一句,你为什么不想在 prod 中也打开 failOnError?
    • 我将其关闭,以便默认行为是安静地失败到日志文件,而不是在用户屏幕上发出大的堆栈跟踪。当然还有其他方法可以实现这一点,无论如何您可能都会设置自己的 500 错误屏幕,所以我想答案是个人喜好。
    【解决方案2】:

    如果您希望将默认约束应用于所有属性应该是:

    grails.gorm.default = {
        constraints {
            '*'(nullable:false, blank:false)
        }
    }
    

    如果要命名约束,可以使用 shared 键将其应用于电子邮件的域类属性:

    static constraints = {
        email(email: true, unique: true, shared: "notBlank")
    }
    

    grails 中的默认设置是不允许空属性,因此您真正需要的是 blank:false(即,不需要您在这种情况下定义的全局默认值)。

    【讨论】:

      猜你喜欢
      • 2013-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-09
      相关资源
      最近更新 更多