【问题标题】:add constraint to plugin domain class为插件域类添加约束
【发布时间】:2014-04-14 01:13:08
【问题描述】:

为了支持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'
    }
}

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

有没有更好的方法?例如,我是否可以在Bootstrap.groovy 中为这些域类添加约束?

【问题讨论】:

    标签: grails


    【解决方案1】:

    可以在 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 是域类的属性。这可以被优化并适用于多个领域类别。

    由于引导程序是最后被处理的事情,它最终应该覆盖先前在域类中定义的约束。

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

    所以当我们使用domain.constraints.body 时,它实际上给出了应用于body 的约束列表作为键body 的值。列表中的每个元素都是一个ConstrainedProperty

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

    【讨论】:

    • 稍作改动,它就可以工作了,谢谢!但是,我认为domainClass.constraints 正在访问一个私有变量,这有点调皮。我想知道是否可以在不访问私有字段的情况下达到相同的结果?
    • 感谢您的编辑,很抱歉我在周五晚些时候回家之前没有对其进行测试。 :) 看看我的更新来回答。评论太长了。
    • 另请注意,我已将示例中的字段类型检查为String,以确保maxSize 约束仅应用于字符串属性。使用时会产生噪音吗? @唐
    猜你喜欢
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2016-08-30
    • 2018-01-04
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多