2

我想要一个由地图引用的嵌入式文档(如下面的“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
    }
}
4

2 回答 2

3

正如 Art Hanzel 建议的那样,嵌入效果很好。

但是,您的问题来自您尝试使用 List 泛型作为一种约束的事实:

Map<String, X>

问题是 Grails 不能很好地处理这种语法,首先是因为Groovy 不支持泛型

但是,MongoDB 插件提供了一个非常强大的功能,可以让您将自定义类型定义为域类属性:请参见此处

在你的情况下,你可以

class A {
    static mapWith = "mongo"
    MyClass map = new MyClass()
}

然后在你的 src/java 例如你可以实现一个

class MyClass extends HashMap<String,X> { }

然后,当然,您必须定义一个特殊的 AbstractMappingAwareCustomTypeMarshaller 来指定如何在 DB 中读取和写入属性。

另一个步骤也可能是向 A 类添加自定义验证器以检查数据的有效性......

于 2012-09-02T09:00:52.100 回答
0

MongoDB Grails 插件文档描述了如何制作嵌入式文档:

class Foo {
    Address address
    List otherAddresses
    static embedded = ['address', 'otherAddresses']
}

在我的脑海中,您应该能够通过对象图访问这些。我看不出有什么理由你不应该这样做。

myFoo.address.myAddressProperty...
于 2012-08-14T12:26:22.440 回答