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 26c961609..beab06007 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 @@ -700,10 +700,9 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { initializeVersionProperty(objectToSave); - BasicDBObject dbDoc = new BasicDBObject(); - maybeEmitEvent(new BeforeConvertEvent(objectToSave)); - writer.write(objectToSave, dbDoc); + + DBObject dbDoc = toDbObject(objectToSave, writer); maybeEmitEvent(new BeforeSaveEvent(objectToSave, dbDoc)); Object id = insertDBObject(collectionName, dbDoc, objectToSave.getClass()); @@ -712,6 +711,26 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { maybeEmitEvent(new AfterSaveEvent(objectToSave, dbDoc)); } + /** + * @param objectToSave + * @param writer + * @return + */ + private DBObject toDbObject(T objectToSave, MongoWriter writer) { + + if (!(objectToSave instanceof String)) { + DBObject dbDoc = new BasicDBObject(); + writer.write(objectToSave, dbDoc); + return dbDoc; + } else { + try { + return (DBObject) JSON.parse((String) objectToSave); + } catch (JSONParseException e) { + throw new MappingException("Could not parse given String to save into a JSON document!", e); + } + } + } + private void initializeVersionProperty(Object entity) { MongoPersistentEntity mongoPersistentEntity = getPersistentEntity(entity.getClass()); @@ -851,19 +870,9 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { assertUpdateableIdIfNotSet(objectToSave); - DBObject dbDoc = new BasicDBObject(); - maybeEmitEvent(new BeforeConvertEvent(objectToSave)); - if (!(objectToSave instanceof String)) { - writer.write(objectToSave, dbDoc); - } else { - try { - dbDoc = (DBObject) JSON.parse((String) objectToSave); - } catch (JSONParseException e) { - throw new MappingException("Could not parse given String to save into a JSON document!", e); - } - } + DBObject dbDoc = toDbObject(objectToSave, writer); 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 16a3a05f4..febdcdf60 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 @@ -1996,6 +1996,24 @@ public class MongoTemplateTests { assertThat(result.get(2).getClass(), is((Object) VerySpecialDoc.class)); } + /** + * @see DATAMONGO-771 + */ + @Test + public void allowInsertWithPlainJsonString() { + + String id = "4711"; + String value = "bubu"; + String json = String.format("{_id:%s, field: '%s'}", id, value); + + template.insert(json, "sample"); + List result = template.findAll(Sample.class); + + assertThat(result.size(), is(1)); + assertThat(result.get(0).id, is(id)); + assertThat(result.get(0).field, is(value)); + } + static interface Model { String value();