diff --git a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchEntityMapper.java b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchEntityMapper.java index aaa750b57..baf3b60af 100644 --- a/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchEntityMapper.java +++ b/src/main/java/org/springframework/data/elasticsearch/core/ElasticsearchEntityMapper.java @@ -294,6 +294,9 @@ public class ElasticsearchEntityMapper implements if (value instanceof List) { target.add(readValue(value, property, property.getTypeInformation().getActualType())); + } else if (value instanceof Map) { + target + .add(readMapValue((Map) value, property, property.getTypeInformation().getActualType())); } else { target.add(readEntity(computeGenericValueTypeForRead(property, value), (Map) value)); } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchEntityMapperUnitTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchEntityMapperUnitTests.java index 02e73278f..e97661c2c 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchEntityMapperUnitTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ElasticsearchEntityMapperUnitTests.java @@ -531,6 +531,32 @@ public class ElasticsearchEntityMapperUnitTests { assertThat(target.address).isEqualTo(bigBunsCafe); } + @Test // DATAES-892 + public void readGenericListWithMaps() { + Map simpleMap = new HashMap<>(); + simpleMap.put("int", 1); + + List> listWithSimpleMap = new ArrayList<>(); + listWithSimpleMap.add(simpleMap); + + Map>> mapWithSimpleList = new HashMap<>(); + mapWithSimpleList.put("someKey", listWithSimpleMap); + + Map document = new LinkedHashMap<>(); + document.put("schemaLessObject", mapWithSimpleList); + + SchemaLessObjectWrapper wrapper = entityMapper.read(SchemaLessObjectWrapper.class, document); + assertThat(wrapper.getSchemaLessObject()).isEqualTo(mapWithSimpleList); + } + + @Data + @NoArgsConstructor + @AllArgsConstructor + static class SchemaLessObjectWrapper { + + private Map schemaLessObject; + } + private String pointTemplate(String name, Point point) { return String.format(Locale.ENGLISH, "\"%s\":{\"lat\":%.1f,\"lon\":%.1f}", name, point.getX(), point.getY()); }