【问题标题】:POGO to Mongo DBObjectPOGO 到 Mongo DBObject
【发布时间】:2013-11-20 21:21:03
【问题描述】:

抱歉,这是 Grails 和 Mongo 的新手问题,因为我让自己感到困惑。

我有一个带有嵌套结构的 POGO(非域类),我需要将其存储在 MongoDB 中。我有如下示例代码,但这只会生成顶级对象的属性映射,并且由于嵌套的 Name 对象,插入失败

class Name {
    String firstName
    String lastName
}

class Details {
    Name name
    String street
    String city
    String postcode

    Name[] siblings
}

// Get only the properties we want to save 
def dbObject = details.properties.findAll { !['class', 'metaClass'].contains(it.key) }

// Insert it into the details collection
db.details.insert(dbObject)

然后我尝试了这个示例代码答案Grails JSONBuilder,但我得到了以下堆栈跟踪

org.apache.commons.lang.UnhandledException: org.codehaus.groovy.grails.web.converters.exceptions.ConverterException: Unconvertable Object of class: java.util.LinkedHashMap
        at org.codehaus.groovy.grails.web.converters.AbstractConverter.toString(AbstractConverter.java:112)
        at grails.converters.JSON.toString(JSON.java:232)
        at grails.converters.JSON$toString.call(Unknown Source)
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
        at JSONSerializer.getJSON(JsonSerializer.groovy:21)

【问题讨论】:

    标签: mongodb grails


    【解决方案1】:

    您可以在 BootStrap.groovy 中为您的类注册自定义 JSON 编组器。

    def init = { servletContext ->
    
        def NameMarshaller = { Name it ->
            [firstName:it.firstName, lastName:it.lastName]
        }
    
        def DetailsMarshaller = { Details it->
            [name:it.name,...,siblings:it.siblings]
        }
    
    
        JSON.registerObjectMarshaller(Name, NameMarshaller)
        JSON.registerObjectMarshaller(Details, DetailsMarshaller)
        ...
    }
    

    在您的应用中,只需执行此操作

    db.details.insert(detailsObject as JSON)
    

    在编组器中注册的父类和子类中的属性将被持久化,'class'和'metaClass'不会因为你没有列出它们,你可以在你的代码中保存这行属性过滤。自定义编组器只需将您的 POGO 转换为地图。

    【讨论】:

    • 感谢您的建议
    • 好主意集威。知道如何调用 grails monodb 插件的默认编组器吗?
    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多