我尝试将属性地图保留为单个JSON编码列,如this question所示。
我遇到的问题是,无法在默认地图构造函数中设置瞬态属性。鉴于任何短暂的领域:
class Test {
//...
String foo
static transients = ['foo']
}
似乎地图构造函数(Grails以各种方式覆盖)只是丢弃瞬态字段:
groovy:000> t = new Test(foo:'bar')
===> Test : (unsaved)
groovy:000> t.foo
===> null
直接分配(通过setter方法)按预期工作:
groovy:000> c.foo = 'bar'
===> bar
groovy:000> c.foo
===> bar
有没有办法让地图构造函数接受瞬态字段?
或者更确切地说:是否有更好的方法将Map
作为单个JSON编码的数据库字段保留,而不是linked question中显示的方法?
以下是完整的示例:
import grails.converters.JSON
class JsonMap {
Map data
String dataAsJSON
static transients = ['data']
def afterLoad() { data = JSON.parse(dataAsJSON) }
def beforeValidate() { dataAsJSON = data as JSON }
}
我可以使用setter设置data
(然后将其转换为dataAsJSON
)但不使用地图构造函数。
答案 0 :(得分:4)
GORM中的映射构造函数使用数据绑定机制,默认情况下,瞬态属性不是数据绑定的。但您可以使用bindable constraint
覆盖此内容class Test {
//...
String foo
static transients = ['foo']
static constraints = {
foo bindable:true
}
}
答案 1 :(得分:1)
我还回复了您的original question,您不需要json转换来实现您的需求。但是,如果您需要严重转换json,为什么不在getter / setter中实现它呢?
class Test {
String propsAsJson
static transients = ['props']
public Map getProps() {
return JSON.parse(propsAsJson)
}
public void setProps(Map props) {
propsAsJson = props as JSON
}
}
//So you can do
Test t = new Test(props : ["foo" : "bar"])
t.save()
通过这种方式,您可以封装转换内容,而在DB中,您可以将属性设置为Json。
答案 2 :(得分:0)
您可以通过将JSON转换方法添加到域类来简化您的案例,它们应该与GORMing无关:
class Test {
String title
void titleFromJSON( json ){
title = json.toStringOfSomeKind()
}
def titleAsJSON(){
new JSON( title )
}
}