Grails:在地图构造函数中设置瞬态字段

时间:2014-09-09 15:55:03

标签: json grails constructor gorm transient

我尝试将属性地图保留为单个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)但不使用地图构造函数。

3 个答案:

答案 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 )
    }

}