diff --git a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java index 7de1c517d..4fb7ba682 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/elc/RequestConverter.java @@ -55,6 +55,7 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.time.Duration; import java.util.ArrayList; @@ -144,14 +145,12 @@ public CreateIndexRequest indicesCreateRequest(IndexCoordinates indexCoordinates createRequestBuilder.index(indexCoordinates.getIndexName()); // note: the new client does not support the index.storeType anymore - String settingsJson = Document.from(settings).toJson(); - IndexSettings indexSettings = fromJson(settingsJson, IndexSettings._DESERIALIZER); - createRequestBuilder.settings(indexSettings); + createRequestBuilder.settings(IndexSettings.of(b -> b // + .withJson(new StringReader(Document.from(settings).toJson())))); if (mapping != null) { - String mappingJson = mapping.toJson(); - TypeMapping typeMapping = fromJson(mappingJson, TypeMapping._DESERIALIZER); - createRequestBuilder.mappings(typeMapping); + createRequestBuilder.mappings(TypeMapping.of(b -> b // + .withJson(new StringReader(mapping.toJson())))); } return createRequestBuilder.build(); @@ -243,11 +242,12 @@ public PutMappingRequest indicesPutMappingRequest(IndexCoordinates indexCoordina Assert.notNull(indexCoordinates, "indexCoordinates must not be null"); Assert.notNull(mapping, "mapping must not be null"); - PutMappingRequest.Builder builder = new PutMappingRequest.Builder(); - builder.index(Arrays.asList(indexCoordinates.getIndexNames())); - addPropertiesToMapping(builder, mapping); + PutMappingRequest request = new PutMappingRequest.Builder() // + .withJson(new StringReader(mapping.toJson())) // + .index(Arrays.asList(indexCoordinates.getIndexNames())) // + .build(); - return builder.build(); + return request; } public GetMappingRequest indicesGetMappingRequest(IndexCoordinates indexCoordinates) { @@ -257,23 +257,6 @@ public GetMappingRequest indicesGetMappingRequest(IndexCoordinates indexCoordina return new GetMappingRequest.Builder().index(Arrays.asList(indexCoordinates.getIndexNames())).build(); } - private void addPropertiesToMapping(PutMappingRequest.Builder builder, Document mapping) { - Object properties = mapping.get("properties"); - - if (properties != null) { - - if (properties instanceof Map) { - Map propertiesMap = new HashMap<>(); - // noinspection unchecked - ((Map) properties).forEach((key, value) -> { - Property property = getProperty(value); - propertiesMap.put(key, property); - }); - builder.properties(propertiesMap); - } - } - } - private Property getProperty(Object value) { // noinspection SpellCheckingInspection ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java b/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java index 76ef14441..3f3912b20 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/index/MappingBuilderIntegrationTests.java @@ -43,7 +43,16 @@ import org.springframework.context.annotation.Import; import org.springframework.data.annotation.Id; import org.springframework.data.elasticsearch.NewElasticsearchClientDevelopment; -import org.springframework.data.elasticsearch.annotations.*; +import org.springframework.data.elasticsearch.annotations.DateFormat; +import org.springframework.data.elasticsearch.annotations.Document; +import org.springframework.data.elasticsearch.annotations.Dynamic; +import org.springframework.data.elasticsearch.annotations.Field; +import org.springframework.data.elasticsearch.annotations.FieldType; +import org.springframework.data.elasticsearch.annotations.InnerField; +import org.springframework.data.elasticsearch.annotations.Mapping; +import org.springframework.data.elasticsearch.annotations.MultiField; +import org.springframework.data.elasticsearch.annotations.Setting; +import org.springframework.data.elasticsearch.annotations.TermVector; import org.springframework.data.elasticsearch.core.ElasticsearchOperations; import org.springframework.data.elasticsearch.core.IndexOperations; import org.springframework.data.elasticsearch.core.MappingContextBaseTests; @@ -205,11 +214,37 @@ void shouldWriteMappingForDisabledProperty() { } @Test // #1767 - @DisplayName("should write dynamic mapping annotations") - void shouldWriteDynamicMappingAnnotations() { + @DisplayName("should write dynamic mapping annotations on create") + void shouldWriteDynamicMappingAnnotationsOnCreate() { IndexOperations indexOps = operations.indexOps(DynamicMappingAnnotationEntity.class); indexOps.createWithMapping(); + + var mapping = indexOps.getMapping(); + var dynamic = mapping.get("dynamic"); + if (dynamic instanceof String s) { + assertThat(dynamic).isEqualTo("false"); + } else { + assertThat(mapping.get("dynamic")).isEqualTo(false); + } + } + + @Test // #2478 + @DisplayName("should write dynamic mapping annotations on put") + void shouldWriteDynamicMappingAnnotationsOnPut() { + + IndexOperations indexOps = operations.indexOps(DynamicMappingAnnotationEntity.class); + indexOps.create(); + + indexOps.putMapping(); + + var mapping = indexOps.getMapping(); + var dynamic = mapping.get("dynamic"); + if (dynamic instanceof String s) { + assertThat(dynamic).isEqualTo("false"); + } else { + assertThat(mapping.get("dynamic")).isEqualTo(false); + } } @Test // #1871