抱歉,这是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)

最佳答案

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

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转换为 map 即可。

09-28 03:11