POGO到Mongo DBObject

时间:2013-11-20 21:21:04

标签: mongodb grails

对不起,这是Grails和Mongo的一个新手问题,因为我让自己感到困惑。

我有一个嵌套结构的POGO(非Domain类),我需要存储在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)

1 个答案:

答案 0 :(得分:2)

您可以在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)

在marshallers中注册的父类和子类中的属性将被保留,'class'和'metaClass'将不会被列出,因为您可以在代码中保存属性过滤行。自定义编组只需将您的POGO转换为地图。