代码之家  ›  专栏  ›  技术社区  ›  Tobia

Grails:在map构造函数中设置临时字段

  •  2
  • Tobia  · 技术社区  · 10 年前

    我尝试将财产映射持久化为单个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编码的DB字段,而不是 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 }
    }
    

    我可以设置 data 使用setter(然后将其转换为 dataAsJSON )但不使用映射构造函数。

    3 回复  |  直到 10 年前
        1
  •  4
  •   Ian Roberts    10 年前

    GORM中的映射构造函数使用数据绑定机制,默认情况下瞬态财产不可数据绑定。但您可以使用 bindable constraint

    class Test {
        //...
        String foo
        static transients = ['foo']
    
        static constraints = {
            foo bindable:true
        }
    }
    
        2
  •  1
  •   Community abligh    7 年前

    我还回复了您的 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。

        3
  •  0
  •   injecteer    10 年前

    您可以通过将JSON转换方法添加到域类来简化您的情况,它们应该与GORMing无关:

    class Test {
        String title
    
        void titleFromJSON( json ){ 
          title = json.toStringOfSomeKind()
        }
    
        def titleAsJSON(){ 
          new JSON( title )
        }
    
    }