使用Spring Data MongoDB时将Map用作bean中的属性时出现异常?

时间:2014-07-24 17:08:06

标签: java spring mongodb spring-data spring-data-mongodb

我想在我的bean中存储一个Map属性,并希望它使用Spring Data Mongodb存储在MongoDB中。

public class Sample {
   Map values;
   //constructor, getters and setters go here
}

保存很好。假设我使用这个bean保存了一个像这样的Mongo文件:

{
  "values": {
     "id":123,
     "name":"Vivek"
   }
 }

现在,我想回复一下这个文件。所以,我写的是这样的:

 Query.addCriteria(Criteria.where("values.id").is(123));

执行find()时会导致异常。

java.lang.IllegalArgumentException: [Assertion failed] - this argument is required; it must not be null
at org.springframework.util.Assert.notNull(Assert.java:112)
at org.springframework.util.Assert.notNull(Assert.java:123)
at org.springframework.data.mapping.PropertyPath.<init>(PropertyPath.java:69)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:327)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:307)
at org.springframework.data.mapping.PropertyPath.create(PropertyPath.java:290)
at org.springframework.data.mapping.PropertyPath.from(PropertyPath.java:274)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.getPath(QueryMapper.java:559)
at org.springframework.data.mongodb.core.convert.QueryMapper$MetadataBackedField.<init>(QueryMapper.java:486)
at org.springframework.data.mongodb.core.convert.QueryMapper.getMappedObject(QueryMapper.java:104)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1489)
at org.springframework.data.mongodb.core.MongoTemplate.doFind(MongoTemplate.java:1480)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:527)
at org.springframework.data.mongodb.core.MongoTemplate.find(MongoTemplate.java:518)

我们如何摆脱这种异常?

2 个答案:

答案 0 :(得分:1)

我必须将Map values;更改为Map<Object,Object> values;,然后才开始工作。

答案 1 :(得分:0)

试试这个

    Query query = new Query(Criteria.where("values._id").is(id));

    query.fields().include("values.$");

    Sample sample= mongoTemplate.findOne(query, Sample.class,"sample");

    Map values= sample.getValues();

如果您仍面临同样的问题,请尝试更改名称值,因为这似乎是一个保留字。