From b9af92059d93ce6ad70f085da9bd434e7a329ff8 Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 25 Apr 2023 10:03:16 +0200 Subject: [PATCH] Fix regression in value to String mapping. Previous versions allow arbitrary values to be mapped to an string property by calling the ObjectToString converter. This behaviour got lost and is not reestablished. Closes #4371 Original pull request #4373 --- .../data/mongodb/core/convert/MappingMongoConverter.java | 9 +++------ .../core/convert/MappingMongoConverterUnitTests.java | 8 ++++++++ 2 files changed, 11 insertions(+), 6 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 eaf06b8db..29802fb99 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 @@ -2329,8 +2329,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App if (source instanceof Collection) { Class rawType = typeHint.getType(); - if (!Object.class.equals(rawType)) { + if (!Object.class.equals(rawType) && !String.class.equals(rawType)) { + if (!rawType.isArray() && !ClassUtils.isAssignable(Iterable.class, rawType)) { + throw new MappingException( String.format(INCOMPATIBLE_TYPES, source, source.getClass(), rawType, getPath())); } @@ -2359,11 +2361,6 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App return (S) dbRefConverter.convert(context, (DBRef) source, typeHint); } - if (source instanceof Collection) { - throw new MappingException( - String.format(INCOMPATIBLE_TYPES, source, BasicDBList.class, typeHint.getType(), getPath())); - } - if (BsonUtils.supportsBson(source)) { return (S) documentConverter.convert(context, BsonUtils.asBson(source), typeHint); } 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 79e15e0f0..10c189c11 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 @@ -2858,6 +2858,14 @@ class MappingMongoConverterUnitTests { assertThat(converter.read(Cyclic.class, source).cycle.value).isEqualTo("v2"); } + @Test // GH-4371 + void shouldConvertTypesToStringTargetType() { + + org.bson.Document source = org.bson.Document.parse("{\n" + " city : [\"Gotham\", \"Metropolis\"]\n" + "}\n"); + + assertThat(converter.read(Address.class, source).city).isEqualTo("Gotham,Metropolis"); + } + static class GenericType { T content; }