From 342f9ae837091b024187a65408cd764da28c81b6 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 15 Oct 2012 11:49:29 -0400 Subject: [PATCH] DATAMONGO-551 - MongoTemplate can now persist plain Strings if they are valid JSON. Added some code to MongoTemplate that inspects the object to be saved for being a String. If it is we try to parse the given String into a JSON document and continue as if we had been given a DBObject initially. Non-parseable Strings are rejected with a MappingException. --- .../data/mongodb/core/MongoTemplate.java | 13 ++++++++++++- .../data/mongodb/core/MongoTemplateTests.java | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java index 560004f1b..a86866388 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java @@ -101,6 +101,7 @@ import com.mongodb.ReadPreference; import com.mongodb.WriteConcern; import com.mongodb.WriteResult; import com.mongodb.util.JSON; +import com.mongodb.util.JSONParseException; /** * Primary implementation of {@link MongoOperations}. @@ -790,6 +791,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { } } + @SuppressWarnings("unchecked") protected void doSave(String collectionName, T objectToSave, MongoWriter writer) { assertUpdateableIdIfNotSet(objectToSave); @@ -797,7 +799,16 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { DBObject dbDoc = new BasicDBObject(); maybeEmitEvent(new BeforeConvertEvent(objectToSave)); - writer.write(objectToSave, dbDoc); + + if (!(objectToSave instanceof String)) { + writer.write(objectToSave, dbDoc); + } else { + try { + objectToSave = (T) JSON.parse((String) objectToSave); + } catch (JSONParseException e) { + throw new MappingException("Could not parse given String to save into a JSON document!", e); + } + } maybeEmitEvent(new BeforeSaveEvent(objectToSave, dbDoc)); Object id = saveDBObject(collectionName, dbDoc, objectToSave.getClass()); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index edca3d7ae..bb45d8278 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -1393,6 +1393,22 @@ public class MongoTemplateTests { assertThat(result.get("_id"), is(dbObject.get("_id"))); } + /** + * @see DATAMONGO-551 + */ + @Test + public void writesPlainString() { + template.save("{ 'foo' : 'bar' }", "collection"); + } + + /** + * @see DATAMONGO-551 + */ + @Test(expected = MappingException.class) + public void rejectsNonJsonStringForSave() { + template.save("Foobar!", "collection"); + } + static class MyId { String first;