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 9e59443c2..0cea748ef 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 @@ -596,7 +596,9 @@ public class MappingElasticsearchConverter Map target = new LinkedHashMap<>(); Streamable> mapSource = Streamable.of(value.entrySet()); - if (typeHint.getActualType() != null && !typeHint.getActualType().getType().equals(Object.class) + TypeInformation actualType = typeHint.getActualType(); + + if (actualType != null && !actualType.getType().equals(Object.class) && isSimpleType(typeHint.getMapValueType().getType())) { mapSource.forEach(it -> { 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 6f1334be4..555634f3f 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 @@ -789,6 +789,30 @@ public class MappingElasticsearchConverterUnitTests { assertThat(entity.locations).containsExactly(new GeoPoint(12.34, 23.45), new GeoPoint(34.56, 45.67)); } + @Test // DATAES-865 + void shouldWriteEntityWithMapAsObject() throws JSONException { + + Map map = new LinkedHashMap<>(); + map.put("foo", "bar"); + + EntityWithObject entity = new EntityWithObject(); + entity.setId("42"); + entity.setContent(map); + + String expected = "{\n" + // + " \"id\": \"42\",\n" + // + " \"content\": {\n" + // + " \"foo\": \"bar\"\n" + // + " }\n" + // + "}\n"; // + + Document document = Document.create(); + + mappingElasticsearchConverter.write(entity, document); + + assertEquals(expected, document.toJson(), false); + } + private String pointTemplate(String name, Point point) { return String.format(Locale.ENGLISH, "\"%s\":{\"lat\":%.1f,\"lon\":%.1f}", name, point.getX(), point.getY()); } @@ -1016,4 +1040,10 @@ public class MappingElasticsearchConverterUnitTests { @Id String id; List locations; } + + @Data + static class EntityWithObject { + @Id private String id; + private Object content; + } }