From 5d3cc3fa04c1a017fbbb569c4366a20ee937e514 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 21 Aug 2013 08:34:36 +0200 Subject: [PATCH] DATAMONGO-743 - Added DBObjectToStringConverter. Added a reading converter to dump DBObject instances into a String directly to enable executing queries against MongoDB into a String version of the query result without marshaling the DBObject into a Map first. --- .../mongodb/core/convert/CustomConversions.java | 2 ++ .../data/mongodb/core/convert/MongoConverters.java | 14 ++++++++++++++ .../convert/MappingMongoConverterUnitTests.java | 10 ++++++++++ 3 files changed, 26 insertions(+) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java index 6b2d76431..2d9646ffd 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/CustomConversions.java @@ -39,6 +39,7 @@ import org.springframework.data.convert.WritingConverter; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.mongodb.core.convert.MongoConverters.BigDecimalToStringConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.BigIntegerToStringConverter; +import org.springframework.data.mongodb.core.convert.MongoConverters.DBObjectToStringConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigDecimalConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToBigIntegerConverter; import org.springframework.data.mongodb.core.convert.MongoConverters.StringToURLConverter; @@ -98,6 +99,7 @@ public class CustomConversions { this.converters.add(StringToBigIntegerConverter.INSTANCE); this.converters.add(URLToStringConverter.INSTANCE); this.converters.add(StringToURLConverter.INSTANCE); + this.converters.add(DBObjectToStringConverter.INSTANCE); this.converters.addAll(JodaTimeConverters.getConvertersToRegister()); this.converters.addAll(converters); diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java index 07655c844..b432b389c 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MongoConverters.java @@ -24,8 +24,11 @@ import org.bson.types.ObjectId; import org.springframework.core.convert.ConversionFailedException; import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.Converter; +import org.springframework.data.convert.ReadingConverter; import org.springframework.util.StringUtils; +import com.mongodb.DBObject; + /** * Wrapper class to contain useful converters for the usage with Mongo. * @@ -147,4 +150,15 @@ abstract class MongoConverters { } } } + + @ReadingConverter + public static enum DBObjectToStringConverter implements Converter { + + INSTANCE; + + @Override + public String convert(DBObject source) { + return source == null ? null : source.toString(); + } + } } 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 3d31d1f18..3282a0430 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 @@ -1415,6 +1415,16 @@ public class MappingMongoConverterUnitTests { assertThat(((Person) value).lastname, is("converter")); } + /** + * @see DATAMONGO-743 + */ + @Test + public void readsIntoStringsOutOfTheBox() { + + DBObject dbObject = new BasicDBObject("firstname", "Dave"); + assertThat(converter.read(String.class, dbObject), is("{ \"firstname\" : \"Dave\"}")); + } + @Document class MapDBRef { @org.springframework.data.mongodb.core.mapping.DBRef Map map;