DATAMONGO-549 - Fixed potential NullPointerException in MongoTemplate.
Added assertions and guards against MongoPersistentEntity lookups resulting in null values.
This commit is contained in:
@@ -733,15 +733,20 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void save(Object objectToSave) {
|
public void save(Object objectToSave) {
|
||||||
|
|
||||||
|
Assert.notNull(objectToSave);
|
||||||
save(objectToSave, determineEntityCollectionName(objectToSave));
|
save(objectToSave, determineEntityCollectionName(objectToSave));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void save(Object objectToSave, String collectionName) {
|
public void save(Object objectToSave, String collectionName) {
|
||||||
|
|
||||||
|
Assert.notNull(objectToSave);
|
||||||
|
Assert.hasText(collectionName);
|
||||||
|
|
||||||
MongoPersistentEntity<?> mongoPersistentEntity = getPersistentEntity(objectToSave.getClass());
|
MongoPersistentEntity<?> mongoPersistentEntity = getPersistentEntity(objectToSave.getClass());
|
||||||
|
|
||||||
// No optimistic locking -> simple save
|
// No optimistic locking -> simple save
|
||||||
if (!mongoPersistentEntity.hasVersionProperty()) {
|
if (mongoPersistentEntity == null || !mongoPersistentEntity.hasVersionProperty()) {
|
||||||
doSave(collectionName, objectToSave, this.mongoConverter);
|
doSave(collectionName, objectToSave, this.mongoConverter);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -993,7 +998,7 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware {
|
|||||||
private void assertUpdateableIdIfNotSet(Object entity) {
|
private void assertUpdateableIdIfNotSet(Object entity) {
|
||||||
|
|
||||||
MongoPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(entity.getClass());
|
MongoPersistentEntity<?> persistentEntity = mappingContext.getPersistentEntity(entity.getClass());
|
||||||
MongoPersistentProperty idProperty = persistentEntity.getIdProperty();
|
MongoPersistentProperty idProperty = persistentEntity == null ? null : persistentEntity.getIdProperty();
|
||||||
|
|
||||||
if (idProperty == null) {
|
if (idProperty == null) {
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -24,8 +24,10 @@ import static org.springframework.data.mongodb.core.query.Update.*;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
import org.bson.types.ObjectId;
|
import org.bson.types.ObjectId;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
@@ -43,6 +45,7 @@ import org.springframework.dao.DataIntegrityViolationException;
|
|||||||
import org.springframework.dao.OptimisticLockingFailureException;
|
import org.springframework.dao.OptimisticLockingFailureException;
|
||||||
import org.springframework.data.annotation.Id;
|
import org.springframework.data.annotation.Id;
|
||||||
import org.springframework.data.annotation.PersistenceConstructor;
|
import org.springframework.data.annotation.PersistenceConstructor;
|
||||||
|
import org.springframework.data.mapping.model.MappingException;
|
||||||
import org.springframework.data.mongodb.InvalidMongoDbApiUsageException;
|
import org.springframework.data.mongodb.InvalidMongoDbApiUsageException;
|
||||||
import org.springframework.data.mongodb.MongoDbFactory;
|
import org.springframework.data.mongodb.MongoDbFactory;
|
||||||
import org.springframework.data.mongodb.core.convert.CustomConversions;
|
import org.springframework.data.mongodb.core.convert.CustomConversions;
|
||||||
@@ -1322,6 +1325,33 @@ public class MongoTemplateTests {
|
|||||||
assertThat(template.findAll(PersonWithConvertedId.class, collectionName).isEmpty(), is(true));
|
assertThat(template.findAll(PersonWithConvertedId.class, collectionName).isEmpty(), is(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see DATAMONGO-549
|
||||||
|
*/
|
||||||
|
public void savesMapCorrectly() {
|
||||||
|
|
||||||
|
Map<String, String> map = new HashMap<String, String>();
|
||||||
|
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 {
|
static class MyId {
|
||||||
|
|
||||||
String first;
|
String first;
|
||||||
|
|||||||
Reference in New Issue
Block a user