From d2a18e9b113733671ede89ff632b8b02aefaf9a2 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 11 Jan 2012 20:06:03 +0100 Subject: [PATCH] DATAMONGO-373 - Fixed potential ClassCastException in QueryMapper. QueryMapper assumed finding a BasicBSONList for $(n)or operators. This is generally true if the DBObject was created through our Query abstraction. If you use the MongoDB driver QueryBuilder this will fail. We're now only insisting on an Iterable which fixes the issue. --- .../data/mongodb/core/QueryMapper.java | 4 ++-- .../mongodb/core/query/QueryMapperUnitTests.java | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryMapper.java index a90896b2c..559a607df 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryMapper.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/QueryMapper.java @@ -89,9 +89,9 @@ public class QueryMapper { newKey = "_id"; } else if (key.startsWith("$") && key.endsWith("or")) { // $or/$nor - BasicBSONList conditions = (BasicBSONList) value; + Iterable conditions = (Iterable) value; BasicBSONList newConditions = new BasicBSONList(); - Iterator iter = conditions.iterator(); + Iterator iter = conditions.iterator(); while (iter.hasNext()) { newConditions.add(getMappedObject((DBObject) iter.next(), entity)); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/QueryMapperUnitTests.java index 760b9defe..e432637a6 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/QueryMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/query/QueryMapperUnitTests.java @@ -21,6 +21,7 @@ import static org.springframework.data.mongodb.core.query.Criteria.*; import static org.springframework.data.mongodb.core.query.Query.*; import java.math.BigInteger; +import java.util.Arrays; import org.bson.types.ObjectId; import org.junit.Before; @@ -38,6 +39,7 @@ import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import com.mongodb.BasicDBList; import com.mongodb.BasicDBObject; import com.mongodb.DBObject; +import com.mongodb.QueryBuilder; /** * Unit tests for {@link QueryMapper}. @@ -160,6 +162,16 @@ public class QueryMapperUnitTests { assertThat(list.get(0).toString(), is(Enum.INSTANCE.name())); } + /** + * @see DATAMONGO-373 + */ + @Test + public void handlesNativelyBuiltQueryCorrectly() { + + DBObject query = new QueryBuilder().or(new BasicDBObject("foo", "bar")).get(); + mapper.getMappedObject(query, null); + } + class Sample { @Id