对不起,这是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)
答案 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转换为地图。