4

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

grails.gorm.default = {

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

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

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

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

谢谢,唐

4

2 回答 2

6

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

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

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

高温高压

附言

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

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

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

于 2010-01-28T22:30:37.217 回答
3

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

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

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

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

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

于 2010-01-29T00:04:26.853 回答