抱歉,这是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 即可。