From ae62e70c52b594287c617183d96c6a43b539ebb1 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 6 Aug 2018 13:46:39 +0200 Subject: [PATCH] DATAMONGO-2043 - Omit type hint when mapping simple types. Original pull request: #589. --- .../core/convert/MappingMongoConverter.java | 15 +++++++++++++-- .../convert/MappingMongoConverterUnitTests.java | 9 +++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java index 571198f0f..041701724 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java @@ -393,12 +393,23 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App removeFromMap(bson, "_id"); } - boolean handledByCustomConverter = conversions.hasCustomWriteTarget(entityType, Document.class); - if (!handledByCustomConverter && !(bson instanceof Collection)) { + if (requiresTypeHint(entityType)) { typeMapper.writeType(type, bson); } } + /** + * Check if a given type requires a type hint {@literal aka _class attribute} when writing to the document. + * + * @param type must not be {@literal null}. + * @return true if not a simple type, collection or type with custom write target. + */ + private boolean requiresTypeHint(Class type) { + + return !conversions.isSimpleType(type) && !ClassUtils.isAssignable(Collection.class, type) + && !conversions.hasCustomWriteTarget(type, Document.class); + } + /** * Internal write conversion method which should be used for nested invocations. * diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java index deadf8ae2..ab93d548a 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/MappingMongoConverterUnitTests.java @@ -1895,6 +1895,15 @@ public class MappingMongoConverterUnitTests { assertThat(converter.read(Attribute.class, source).value).isInstanceOf(List.class); } + @Test // DATAMONGO-2043 + public void omitsTypeHintWhenWritingSimpleTypes() { + + org.bson.Document target = new org.bson.Document(); + converter.write(new org.bson.Document("value", "FitzChivalry"), target); + + assertThat(target).doesNotContainKeys("_class"); + } + static class GenericType { T content; }