From b0dad317989d0d4b9a010a079ef6146413e58c4b Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Tue, 18 Jul 2023 06:13:48 +0200 Subject: [PATCH] Fix MappingElasticsearchConverter Closes #2627 --- .../MappingElasticsearchConverter.java | 2 +- ...appingElasticsearchConverterUnitTests.java | 62 +++++++++++++++++-- 2 files changed, 57 insertions(+), 7 deletions(-) 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 47e55867fa..64365508a6 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 @@ private List writeCollectionInternal(Collection source, @Nullable Typ 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 b01e7baf82..89c5222d63 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 @@ -909,6 +909,55 @@ void shouldWriteNullValueIfConfigured() throws JSONException { 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 { @@ -1953,12 +2002,12 @@ void shouldWriteEntityWithDottedFieldName() throws JSONException { @Language("JSON") var expected = """ - { - "_class": "org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverterUnitTests$FieldNameDotsEntity", - "id": "42", - "dotted.field": "dotted field" - } - """; + { + "_class": "org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverterUnitTests$FieldNameDotsEntity", + "id": "42", + "dotted.field": "dotted field" + } + """; var entity = new FieldNameDotsEntity(); entity.setId("42"); entity.setDottedField("dotted field"); @@ -3192,6 +3241,7 @@ public void setMapToNotWriteWhenEmpty(@Nullable Map mapToNotWrit this.mapToNotWriteWhenEmpty = mapToNotWriteWhenEmpty; } } + static class FieldNameDotsEntity { @Id @Nullable private String id;