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 bf2fbaee4..fc6d09602 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 @@ -351,10 +351,9 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App } Class entityType = obj.getClass(); - boolean handledByCustomConverter = conversions.getCustomWriteTarget(entityType, DBObject.class) != null; TypeInformation type = ClassTypeInformation.from(entityType); - if (!handledByCustomConverter && !(dbo instanceof BasicDBList)) { + if (requiresTypeHint(entityType)) { typeMapper.writeType(type, dbo); } @@ -363,6 +362,18 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App writeInternal(target, dbo, type); } + /** + * 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, DBObject.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 3a496594c..ac1d55e46 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 @@ -1853,6 +1853,15 @@ public class MappingMongoConverterUnitTests { assertThat(converter.read(Attribute.class, source).value, is(instanceOf(List.class))); } + @Test // DATAMONGO-2043 + public void omitsTypeHintWhenWritingSimpleTypes() { + + DBObject target = new BasicDBObject(); + converter.write(new BasicDBObject("value", "FitzChivalry"), target); + + assertThat(target.get("_class"), is(nullValue())); + } + static class GenericType { T content; }