一尘不染

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

json

我正在尝试将属性的Maps保留为单个JSON编码的列

我遇到的问题是,显然 无法在默认地图构造函数中设置瞬时属性 。给定任何瞬态场:

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比链接的问题中显示的方法更好的方法来将a保留为单个JSON编码的DB字段?

这是完整的示例:

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 }
}

我可以data使用setter进行设置(然后将其转换为dataAsJSON),但不能使用map构造函数。


阅读 259

收藏
2020-07-27

共1个答案

一尘不染

GORM中的地图构造函数使用数据绑定机制,并且默认情况下,瞬态属性不可进行数据绑定。但是您可以使用可绑定约束来覆盖它

class Test {
    //...
    String foo
    static transients = ['foo']

    static constraints = {
        foo bindable:true
    }
}
2020-07-27