添加约束到插件域类

时间:2014-04-11 22:04:20

标签: grails

为了支持UTFMB8 encoding,我在Config.groovy

中添加了以下默认约束
grails.gorm.default.constraints = {
    '*'(maxSize: 191)

    unlimitedSize(maxSize: Integer.MAX_VALUE)
}

我还添加了unlimitedSize共享约束,我在一些域类中使用它来覆盖此默认值,例如。

class BlogPost {
    String body

    static constraints = {
        body shared: 'unlimitedSize'
    }
}

但是,插件中有几个类还需要覆盖191的默认maxSize。在这些情况下,我无法使用共享约束,因为我无法使用编辑源代码。一种选择是将类复制到我的应用程序中,然后编辑副本(因为应用程序中的工件会覆盖插件中的工件),但这不是很吸引人,因为我们已经有效地分叉了这些类。

有更好的方法吗?例如,我是否可以在Bootstrap.groovy

中为这些域类添加约束

1 个答案:

答案 0 :(得分:3)

可以在boostrap中添加约束,例如:

class BootStrap {
    def grailsApplication

    def init = { servletContext ->
        grailsApplication.domainClasses.each { GrailsDomainClass gdc ->
            Class domainClass = gdc.clazz
            if (domainClass.simpleName == 'BookFromPlugin') {

                def field = domainClass.declaredFields.find {
                    it.name == 'body' && it.type == String
                }

                if (field) {
                    domainClass.constraints.body.maxSize = Integer.MAX_VALUE
                }
            }
        }
    }
}

其中BookFromPlugin是来自插件的域类,body是域类的属性。这可以进行优化,并适用于多个域类。

由于bootstrap是最后一件事,它应该最终覆盖先前在域类中定义的约束。

<强>更新
我猜你的意思是domainClass.constraints正在从域类访问私有变量,但事实并非如此。 domain.constraints给出一个地图,其中属性名称映射到其所有约束。这是映射取自ConstrainedProperty,它由3个元素组成:拥有约束的类,将应用约束的属性名称以及属性的类型。

因此,当我们使用domain.constraints.body时,它实际上会将应用于body的约束列表作为键body的值。列表中的每个元素都是ConstrainedProperty

通过调用setMaxSize(),我们只是在约束列表中添加另一个ConstrainedProperty