From 23177fef0c0fe163e44d42543f17a621969d6e5f Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Mon, 12 Jul 2021 10:32:13 +0200 Subject: [PATCH] Custom Converter should also be applicable for simple types. This commit fixes a regression that prevented custom converters from being applied to types considered store native ones. Original pull request: #3703. Fixes #3670 --- .../core/convert/MappingMongoConverter.java | 6 ++++- .../MappingMongoConverterUnitTests.java | 25 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) 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 aced009cd..83be993b9 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 @@ -1173,7 +1173,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App @SuppressWarnings({ "rawtypes", "unchecked" }) private Object getPotentiallyConvertedSimpleRead(Object value, @Nullable Class target) { - if (target == null || ClassUtils.isAssignableValue(target, value)) { + if (target == null) { return value; } @@ -1181,6 +1181,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return doConvert(value, target); } + if (ClassUtils.isAssignableValue(target, value)) { + return value; + } + if (Enum.class.isAssignableFrom(target)) { return Enum.valueOf((Class) target, value.toString()); } 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 369f6dbde..759be5c6b 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 @@ -30,6 +30,7 @@ import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; +import org.bson.types.Binary; import org.bson.types.Code; import org.bson.types.Decimal128; import org.bson.types.ObjectId; @@ -2568,6 +2569,21 @@ class MappingMongoConverterUnitTests { .containsEntry("item3", "i3"); } + @Test // GH-3670 + void appliesCustomConverterEvenToSimpleTypes() { + + converter = new MappingMongoConverter(resolver, mappingContext); + converter.setCustomConversions(MongoCustomConversions.create(it -> { + it.registerConverter(new MongoSimpleTypeConverter()); + })); + converter.afterPropertiesSet(); + + org.bson.Document source = new org.bson.Document("content", new Binary(new byte[] {0x00, 0x42})); + + GenericType target = converter.read(GenericType.class, source); + assertThat(target.content).isInstanceOf(byte[].class); + } + static class GenericType { T content; } @@ -3136,6 +3152,15 @@ class MappingMongoConverterUnitTests { } } + @ReadingConverter + public static class MongoSimpleTypeConverter implements Converter { + + @Override + public byte[] convert(Binary source) { + return source.getData(); + } + } + static class TypeWrappingTypeImplementingMap { String id;