在Spring Data Mongo中使用通用对象

时间:2017-10-05 10:36:34

标签: java spring generics spring-data-mongodb

我使用Spring Data Mongo将我的程序与MongoDB实例连接起来。我在Mongo中存储了类似于以下类型的类型。

@Document
class A<T> {
    @Id String id;
    Instant createdAt;
    List<T> values;
}

如您所见,泛型类型T用于主文档内的属性。我在使用查询提取此类文档时遇到一些问题。我目前正在使用类似于以下声明的内容。

List<A> list = 
    mongoTemplate.find(Query.query(Criteria.where("id").in("id1", "id2"),
                       A.class,
                       "collectionName");

不幸的是,上面的代码不提供对通用字段的任何支持。我查看了文档和MongoTemplate的代码,但我没有找到任何内容。

其他一些 templates 类的Spring提供了这种支持。以RestTemplate为例。 exchange方法有许多签名使用ParameterizedTypeReference<T>来实现类似于我搜索MongoTemplate的内容(例如this)。

在我看来,在MongoTemplate中也有类似的东西。

有没有办法在提取过程中处理泛型类型?

感谢。

1 个答案:

答案 0 :(得分:3)

我认为有一种方法可以使用Spring Data MongoDB支持通用文档。

正如Oliver Gierke在评论中清楚解释的那样:

  

如果没有A<T>的子类型将T绑定到某种类型,那么即使在这里使用泛型类型也没有意义。你可以坚持List<Object>

实现所需要的最佳方法是为每个A类型创建一个values的子类型。像这样:

@Document
public class StringA extends A<String> { ... }

@Document
public class IntegerA extends A<Integer> { ... }