我想要一个由 map 引用的嵌入文档(如下面的“A 类”)。环境是Grails + GORM + MongoDB。
这可能吗?如果可以,如何实现?
class A { // fails with IllegalArgumentException occurred when processing request: can't serialize class X in line 234 of org.bson.BasicBSONEncoder
static mapWith = "mongo"
Map<String, X> map = new HashMap<String, X>()
}
class B { // works
static mapWith = "mongo"
List<X> list = new ArrayList<X>()
}
class C { // works with primitive type values
static mapWith = "mongo"
Map<String, String> map = new HashMap<String, String>()
}
class X {
String data
public X(String data) {
this.data = data
}
}
最佳答案
正如 Art Hanzel 所建议的那样,嵌入效果非常好。
但是您的问题来自于您尝试使用列表通用性作为一种约束的事实:
Map<String, X>
问题是 Grails 无法很好地处理这种语法,首先是因为 Groovy doesn't support genericity .
但是,MongoDB 插件提供了非常强大的功能,可以让您将自定义类型定义为域类属性:see here .
就你的情况而言,你可以有
class A {
static mapWith = "mongo"
MyClass map = new MyClass()
}
然后在你的 src/java 中,例如你可以实现一个
class MyClass extends HashMap<String,X> { }
然后,当然,你必须定义一个特殊的 AbstractMappingAwareCustomTypeMarshaller 来指定如何在 DB 中读写属性。
另一个步骤还可以是向 A 类添加自定义验证器来检查数据的有效性...
关于mongodb - 如何在 MongoDB GORM 中支持嵌入 map (具有自定义值类型)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11921985/