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 e58f166e0..3100d0812 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 @@ -1565,8 +1565,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { MongoPersistentEntity entity = mappingContext.getPersistentEntity(entityClass); - DBObject mappedUpdate = queryMapper.getMappedObject(update.getUpdateObject(), entity); DBObject mappedQuery = queryMapper.getMappedObject(query, entity); + DBObject mappedUpdate = updateMapper.getMappedObject(update.getUpdateObject(), entity); if (LOGGER.isDebugEnabled()) { LOGGER.debug("findAndModify using query: " + mappedQuery + " fields: " + fields + " sort: " + sort 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 5f6d9b4ff..f0e517ee1 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 @@ -1803,12 +1803,12 @@ public class MongoTemplateTests { Document doc = new Document(); doc.id = "4711"; - doc.model = new ModelA().withValue("foo"); + doc.model = new ModelA("foo"); template.insert(doc); Query query = new Query(Criteria.where("id").is(doc.id)); String newModelValue = "bar"; - Update update = Update.update("model", new ModelA().withValue(newModelValue)); + Update update = Update.update("model", new ModelA(newModelValue)); template.updateFirst(query, update, Document.class); Document result = template.findOne(query, Document.class); @@ -2185,26 +2185,43 @@ public class MongoTemplateTests { assertThat(template.find(query, Sample.class), is(not(empty()))); } + /** + * @see DATAMONGO-807 + */ + @Test + public void findAndModifyShouldRetrainTypeInformationWithinUpdatedType() { + + Document document = new Document(); + document.model = new ModelA("value1"); + + template.save(document); + + Query query = query(where("id").is(document.id)); + Update update = Update.update("model", new ModelA("value2")); + template.findAndModify(query, update, Document.class); + + Document retrieved = template.findOne(query, Document.class); + Assert.assertThat(retrieved.model, instanceOf(ModelA.class)); + Assert.assertThat(retrieved.model.value(), equalTo("value2")); + } + static interface Model { String value(); - - Model withValue(String value); } static class ModelA implements Model { private String value; + ModelA(String value) { + this.value = value; + } + @Override public String value() { return this.value; } - @Override - public Model withValue(String value) { - this.value = value; - return this; - } } static class Document { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java index 66965d13f..2fdb1e514 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2013 the original author or authors. + * Copyright 2013-2014 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -36,6 +36,7 @@ import com.mongodb.DBObject; * Unit tests for {@link UpdateMapper}. * * @author Oliver Gierke + * @author Christoph Strobl */ @RunWith(MockitoJUnitRunner.class) public class UpdateMapperUnitTests { @@ -69,6 +70,71 @@ public class UpdateMapperUnitTests { assertThat(list.get("_class"), is((Object) ConcreteChildClass.class.getName())); } + /** + * @see DATAMONGO-807 + */ + @Test + public void updateMapperShouldRetainTypeInformationForNestedEntities() { + + Update update = Update.update("model", new ModelImpl(1)); + UpdateMapper mapper = new UpdateMapper(converter); + + DBObject mappedObject = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(ModelWrapper.class)); + + DBObject set = DBObjectTestUtils.getAsDBObject(mappedObject, "$set"); + DBObject modelDbObject = (DBObject) set.get("model"); + assertThat(modelDbObject.get("_class"), not(nullValue())); + } + + /** + * @see DATAMONGO-807 + */ + @Test + public void updateMapperShouldNotPersistTypeInformationForKnownSimpleTypes() { + + Update update = Update.update("model.value", 1); + UpdateMapper mapper = new UpdateMapper(converter); + + DBObject mappedObject = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(ModelWrapper.class)); + + DBObject set = DBObjectTestUtils.getAsDBObject(mappedObject, "$set"); + assertThat(set.get("_class"), nullValue()); + } + + /** + * @see DATAMONGO-807 + */ + @Test + public void updateMapperShouldNotPersistTypeInformationForNullValues() { + + Update update = Update.update("model", null); + UpdateMapper mapper = new UpdateMapper(converter); + + DBObject mappedObject = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(ModelWrapper.class)); + + DBObject set = DBObjectTestUtils.getAsDBObject(mappedObject, "$set"); + assertThat(set.get("_class"), nullValue()); + } + + static interface Model { + + } + + static class ModelImpl implements Model { + public int value; + + public ModelImpl(int value) { + this.value = value; + } + } + + public class ModelWrapper { + Model model; + } + static class ParentClass { String id;