在Grails 2.1.0上我试图动态更新域类的字段。对象被绑定并且看起来很好,直到调用save方法,这会引发以下异常:
try {
def bindParams = [:]
bindParams."$paramsFieldName" = "$paramsValue"
def domainClass = grailsApplication.domainClasses.find { it.clazz.simpleName == paramsDomain }.clazz
def objectInstance = domainClass.findById(paramsId)
objectInstance."$paramsFieldName" = "$paramsValue"
bindData(objectInstance, bindParams)
objectInstance.save(flush:true ,failOnError:false)
return objectInstance
}
catch (Exception ex) {
log.error ex
return null
}
我尝试使用直接分配绑定该字段并且运行良好。
objectInstance."$paramsFieldName" = convertToType( fieldType.name,paramsValue)
然后我需要处理每种情况的类型转换(我假设)。我需要的是BindDynamicMethod为我处理绑定。使用BindDynamicMethod绑定它时对象会发生什么变化是不可变的?或者我做错了什么导致了它?
=============================================== ==========
事实证明,这发生在一些域上,但是一些在映射上使用缓存的人抛出了这个异常。
class UploadSettings {
String profile = "default"
String displayName
String name
String value
String defaultValue
static mapping = {
//cache usage:'read-only'
}
}
所以我想我现在的问题是,如果域名正在使用缓存,为什么我们无法更新其值?或者我们怎么做?有没有办法捕获域是不可变的?
谢谢
答案 0 :(得分:2)
是的,通过将其设置为只读,你正在使对象不可变,因为错误说,恕我直言,这是误导,因为我们在缓存的背景下,但这背后有一些理由。
如果您需要在域级别进行缓存,那么将其设置为读写应该可以解决问题
请参阅cache usages