【问题标题】:Nested Named Configuration for JSON Marshallers with Grails 2.4.4带有 Grails 2.4.4 的 JSON Marshallers 的嵌套命名配置
【发布时间】:2015-01-19 14:30:17
【问题描述】:

我有以下域类:

class Domain1{
    String prop1
    Domain2 prop2
}

class Domain2{
   String prop3
}

每个都有 2 个命名的 Marshaller 配置

JSON.createNamedConfig('PUBLIC_API'){
        it.registerObjectMarshaller(Domain1){Domain1 domain1->
             return ['key1': domain1.prop1, 'key2': domain1.prop2]
        } 
}

JSON.createNamedConfig('PUBLIC_API'){
        it.registerObjectMarshaller(Domain2){Domain2 domain2->
             return ['key1': domain2.prop3]
        } 
}

当我尝试使用这个命名配置时,编组只在父域的对象上完成,嵌套/子类的编组器甚至不会被调用。

所以,使用这个配置

JSON.use('PUBLIC_API'){
     render domain1 as JSON
}

结果

{
  "key1": "value1",
  "key2": {
       "id": 1,
       "class" : "Domain2",
       "prop3" : "value2"
   }
}

我在grails documentation 中找不到关于命名编组器配置的这种用法的任何信息

有人用过这样的用例吗?或者如果这甚至被支持?

【问题讨论】:

  • 嵌套编组器在没有命名配置的情况下工作正常,但这不是我的用例。我必须为每个域注册至少 2 种不同的格式,我认为命名配置应该是一种解脱。
  • 我最终添加了 3 个不同的配置......一个未命名的配置和 2 个命名的配置到子域。这并不能解决问题,而只是一种解决方法

标签: json grails domain-driven-design marshalling grails-2.0


【解决方案1】:

我已经解决了同样的问题: 对于我的客户,我从不同的域发送类似的 json:

JSON.registerObjectMarshaller(Domain1) { Domain1 domain1->
            return [
                    id      : domain1.id,
                    label   : domain1.prop
            ]
        }
        JSON.registerObjectMarshaller(Domain2) { Domain2 domain2->
            return [
                    id         : domain2.id,
                    label      : domain2.anotherProp
            ]
        }

        render((domains1+ domains2) as JSON);

也许对你有帮助。

【讨论】:

  • 您能详细说明一下吗?什么是(库 + 基因集)?
  • 我相信你误读了这个问题。问题在于嵌套关联,而不是渲染 w.r.t 命名配置。
【解决方案2】:

您是否尝试在同一个 createNamedConfig 块中注册您的编组器?我认为对createNamedConfig 的第二次调用不会使用您在第一次调用中创建的配置。这是我的建议:

JSON.createNamedConfig('PUBLIC_API'){
    it.registerObjectMarshaller(Domain1){Domain1 domain1->
         return ['key1': domain1.prop1, 'key2': domain1.prop2]
    } 

    it.registerObjectMarshaller(Domain2){Domain2 domain2->
         return ['key1': domain2.prop3]
    } 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-10-23
    • 2015-09-15
    • 2013-09-11
    • 2019-05-07
    • 1970-01-01
    • 2013-01-14
    • 2010-12-24
    • 1970-01-01
    相关资源
    最近更新 更多