From f0f12d5296a2e442ccfc8166e06738712e558503 Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Tue, 8 Oct 2013 10:56:41 +0200 Subject: [PATCH] =?UTF-8?q?DATAMONGO-771=20-=20Fix=20raw=20JSON=20string?= =?UTF-8?q?=20handling=20in=20MongoTemplate.insert(=E2=80=A6).?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We now support insertion of JSON objects as plain strings via MongoTemplate.insert(…). Original pull request: #79. --- .../data/mongodb/core/MongoTemplate.java | 37 ++++++++++++------- .../data/mongodb/core/MongoTemplateTests.java | 18 +++++++++ 2 files changed, 41 insertions(+), 14 deletions(-) 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();