From fc1f65f87d5e6bc8efbf23b9d4ea85023b059ec8 Mon Sep 17 00:00:00 2001 From: Peter-Josef Meisch Date: Mon, 25 Jan 2021 21:33:25 +0100 Subject: [PATCH] ReactiveElasticsearchOperations indexName is encoded twice. Original Pull Request #1666 Closes #1665 (cherry picked from commit 4829b07e53fcbea4b391a6688fd70a580f5a62ab) --- .../reactive/DefaultWebClientProvider.java | 14 ++++++++-- .../ReactiveElasticsearchTemplateTests.java | 28 +++++++++++++++++-- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/data/elasticsearch/client/reactive/DefaultWebClientProvider.java b/src/main/java/org/springframework/data/elasticsearch/client/reactive/DefaultWebClientProvider.java index 30be17eca..cbbfb72a8 100644 --- a/src/main/java/org/springframework/data/elasticsearch/client/reactive/DefaultWebClientProvider.java +++ b/src/main/java/org/springframework/data/elasticsearch/client/reactive/DefaultWebClientProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2018-2020 the original author or authors. + * Copyright 2018-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -27,6 +27,7 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.reactive.function.client.WebClient.Builder; +import org.springframework.web.util.DefaultUriBuilderFactory; /** * Default {@link WebClientProvider} that uses cached {@link WebClient} instances per {@code hostAndPort}. @@ -156,7 +157,16 @@ class DefaultWebClientProvider implements WebClientProvider { String baseUrl = String.format("%s://%s:%d%s", this.scheme, socketAddress.getHostString(), socketAddress.getPort(), pathPrefix == null ? "" : '/' + pathPrefix); - WebClient webClient = builder.baseUrl(baseUrl).filter((request, next) -> next.exchange(request).doOnError(errorListener)).build(); + + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory(baseUrl); + // the template will already be encoded by the RequestConverters methods + uriBuilderFactory.setEncodingMode(DefaultUriBuilderFactory.EncodingMode.VALUES_ONLY); + builder.uriBuilderFactory(uriBuilderFactory); // + + WebClient webClient = builder // + .filter((request, next) -> next.exchange(request) // + .doOnError(errorListener)) // + .build(); // return webClientConfigurer.apply(webClient); } } diff --git a/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplateTests.java b/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplateTests.java index ecbad86c9..064fe3b6e 100644 --- a/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplateTests.java +++ b/src/test/java/org/springframework/data/elasticsearch/core/ReactiveElasticsearchTemplateTests.java @@ -31,6 +31,8 @@ import reactor.test.StepVerifier; import java.lang.Long; import java.lang.Object; import java.net.ConnectException; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Collections; import java.util.LinkedHashMap; @@ -49,7 +51,6 @@ import org.elasticsearch.search.sort.SortOrder; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.OptimisticLockingFailureException; import org.springframework.data.annotation.Id; @@ -524,7 +525,8 @@ public class ReactiveElasticsearchTemplateTests { @Test // DATAES-567, DATAES-767 public void aggregateShouldErrorWhenIndexDoesNotExist() { - template.aggregate(new CriteriaQuery(Criteria.where("message").is("some message")), SampleEntity.class, + template + .aggregate(new CriteriaQuery(Criteria.where("message").is("some message")), SampleEntity.class, IndexCoordinates.of("no-such-index")) // .as(StepVerifier::create) // .expectError(ElasticsearchStatusException.class); @@ -981,6 +983,28 @@ public class ReactiveElasticsearchTemplateTests { // --> JUST some helpers + @Test // #1665 + void shouldBeAbleToProcessDateMathIndexNames() { + + String indexName = "foo-" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy.MM")); + String dateMathIndexName = ""; + + SampleEntity entity = randomEntity("foo"); + + template.save(entity, IndexCoordinates.of(dateMathIndexName)) // + .as(StepVerifier::create) // + .expectNext(entity) // + .verifyComplete(); // + + template.get(entity.getId(), SampleEntity.class, IndexCoordinates.of(indexName)) // + .as(StepVerifier::create) // + .expectNext(entity) // + .verifyComplete(); // + + } + // endregion + + // region Helper functions private SampleEntity randomEntity(String message) { return SampleEntity.builder() //