diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index 9ef211408..2790dd5b8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -76,6 +76,8 @@ import com.mongodb.DBRef; */ public class MappingMongoConverter extends AbstractMongoConverter implements ApplicationContextAware, ValueResolver { + private static final String INCOMPATIBLE_TYPES = "Cannot convert %1$s of type %2$s into an instance of %3$s! Implement a custom Converter<%2$s, %3$s> and register it with the CustomConversions. Parent object was: %4$s"; + protected static final Logger LOGGER = LoggerFactory.getLogger(MappingMongoConverter.class); protected final MappingContext, MongoPersistentProperty> mappingContext; @@ -214,6 +216,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return (S) readMap(typeToUse, dbo, path); } + if (dbo instanceof BasicDBList) { + throw new MappingException(String.format(INCOMPATIBLE_TYPES, dbo, BasicDBList.class, typeToUse.getType(), path)); + } + // Retrieve persistent entity info MongoPersistentEntity persistentEntity = (MongoPersistentEntity) mappingContext .getPersistentEntity(typeToUse); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ObjectPath.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ObjectPath.java index cd633956f..8c03da5b8 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ObjectPath.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/ObjectPath.java @@ -21,6 +21,7 @@ import java.util.List; import org.springframework.data.mongodb.core.mapping.MongoPersistentEntity; import org.springframework.util.Assert; +import org.springframework.util.StringUtils; import com.mongodb.DBObject; @@ -120,6 +121,26 @@ class ObjectPath { return items.isEmpty() ? null : items.get(items.size() - 1).getObject(); } + /* + * (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + + if (items.isEmpty()) { + return "[empty]"; + } + + List strings = new ArrayList(items.size()); + + for (ObjectPathItem item : items) { + strings.add(item.object.toString()); + } + + return StringUtils.collectionToDelimitedString(strings, " -> "); + } + /** * An item in an {@link ObjectPath}. * diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java index b0dd7cdfc..434d4bb4f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java @@ -45,7 +45,9 @@ import org.hamcrest.Matchers; import org.joda.time.LocalDate; import org.junit.Before; import org.junit.Ignore; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; @@ -100,6 +102,8 @@ public class MappingMongoConverterUnitTests { @Mock ApplicationContext context; @Mock DbRefResolver resolver; + public @Rule ExpectedException exception = ExpectedException.none(); + @Before public void setUp() { @@ -1826,6 +1830,29 @@ public class MappingMongoConverterUnitTests { verify(mock, times(1)).getTarget(); } + /** + * @see DATAMONGO-1034 + */ + @Test + public void rejectsBasicDbListToBeConvertedIntoComplexType() { + + BasicDBList inner = new BasicDBList(); + inner.add("key"); + inner.add("value"); + + BasicDBList outer = new BasicDBList(); + outer.add(inner); + outer.add(inner); + + BasicDBObject source = new BasicDBObject("attributes", outer); + + exception.expect(MappingException.class); + exception.expectMessage(Item.class.getName()); + exception.expectMessage(BasicDBList.class.getName()); + + converter.read(Item.class, source); + } + static class GenericType { T content; }