为了支持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
?
答案 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
。