From cabbe747f893b32b33237351c3fa4c39b01564c2 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 11 Oct 2012 08:49:49 +0200 Subject: [PATCH] DATAMONGO-549 - Fixed potential NullPointerException in MongoTemplate. Added assertions and guards against MongoPersistentEntity lookups resulting in null values. --- .../data/mongodb/core/MongoTemplate.java | 9 ++++-- .../data/mongodb/core/MongoTemplateTests.java | 30 +++++++++++++++++++ 2 files changed, 37 insertions(+), 2 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 2bd93cf1d..010aafb52 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 @@ -733,15 +733,20 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { } public void save(Object objectToSave) { + + Assert.notNull(objectToSave); save(objectToSave, determineEntityCollectionName(objectToSave)); } public void save(Object objectToSave, String collectionName) { + Assert.notNull(objectToSave); + Assert.hasText(collectionName); + MongoPersistentEntity mongoPersistentEntity = getPersistentEntity(objectToSave.getClass()); // No optimistic locking -> simple save - if (!mongoPersistentEntity.hasVersionProperty()) { + if (mongoPersistentEntity == null || !mongoPersistentEntity.hasVersionProperty()) { doSave(collectionName, objectToSave, this.mongoConverter); return; } @@ -993,7 +998,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { private void assertUpdateableIdIfNotSet(Object entity) { MongoPersistentEntity persistentEntity = mappingContext.getPersistentEntity(entity.getClass()); - MongoPersistentProperty idProperty = persistentEntity.getIdProperty(); + MongoPersistentProperty idProperty = persistentEntity == null ? null : persistentEntity.getIdProperty(); if (idProperty == null) { return; 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 ff30aa8ef..6440674f0 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 @@ -24,8 +24,10 @@ import static org.springframework.data.mongodb.core.query.Update.*; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; import java.util.List; +import java.util.Map; import org.bson.types.ObjectId; import org.joda.time.DateTime; @@ -43,6 +45,7 @@ import org.springframework.dao.DataIntegrityViolationException; import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.PersistenceConstructor; +import org.springframework.data.mapping.model.MappingException; import org.springframework.data.mongodb.InvalidMongoDbApiUsageException; import org.springframework.data.mongodb.MongoDbFactory; import org.springframework.data.mongodb.core.convert.CustomConversions; @@ -1322,6 +1325,33 @@ public class MongoTemplateTests { assertThat(template.findAll(PersonWithConvertedId.class, collectionName).isEmpty(), is(true)); } + /** + * @see DATAMONGO-549 + */ + public void savesMapCorrectly() { + + Map map = new HashMap(); + map.put("key", "value"); + + template.save(map, "maps"); + } + + /** + * @see DATAMONGO-549 + */ + @Test(expected = MappingException.class) + public void savesMongoPrimitiveObjectCorrectly() { + template.save(new Object(), "collection"); + } + + /** + * @see DATAMONGO-549 + */ + @Test(expected = IllegalArgumentException.class) + public void rejectsNullObjectToBeSaved() { + template.save(null); + } + static class MyId { String first;