diff --git a/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java b/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java index e1ebd09b3..a5f0b1440 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverter.java @@ -919,7 +919,7 @@ public class MappingElasticsearchConverter Class elementType = element == null ? null : element.getClass(); - if (elementType == null || conversions.isSimpleType(elementType)) { + if (elementType == null || isSimpleType(elementType)) { collection.add(getPotentiallyConvertedSimpleWrite(element, componentType != null ? componentType.getType() : Object.class)); } else if (element instanceof Collection || elementType.isArray()) { diff --git a/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterUnitTests.java index 85798809a..88f5a20af 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/convert/MappingElasticsearchConverterUnitTests.java @@ -908,6 +908,55 @@ public class MappingElasticsearchConverterUnitTests { assertEquals(expected, document.toJson(), false); } + @Test // #2627 + @DisplayName("should write Map containing collection containing map") + void shouldWriteMapContainingCollectionContainingMap() throws JSONException { + + class EntityWithMapCollectionMap { + Map map; + } + class InnerEntity { + String prop1; + + String prop2; + + public InnerEntity() {} + + public InnerEntity(String prop1, String prop2) { + this.prop1 = prop1; + this.prop2 = prop2; + } + + } + + var entity = new EntityWithMapCollectionMap(); + entity.map = Collections.singletonMap("collection", + Collections.singletonList(Collections.singletonMap("destination", new InnerEntity("prop1", "prop2")))); + + var expected = """ + { + "_class": "org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverterUnitTests$1EntityWithMapCollectionMap", + "map": { + "collection": [ + { + "destination": { + "_class": "org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverterUnitTests$1InnerEntity", + "prop1": "prop1", + "prop2": "prop2" + } + } + ] + } + } + """; + + Document document = Document.create(); + + mappingElasticsearchConverter.write(entity, document); + + assertEquals(expected, document.toJson(), false); + } + @Nested class RangeTests {