Skip to content

Commit d96fcf3

Browse files
committed
Harmonize Elasticsearch converter auto-configuration
This commit harmonizes our auto-configuration so that default converters are configured the same way ElasticsearchConfigurationSupport does. Closes gh-25087
1 parent 7286c33 commit d96fcf3

File tree

2 files changed

+71
-8
lines changed

2 files changed

+71
-8
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataConfiguration.java

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,8 @@
1616

1717
package org.springframework.boot.autoconfigure.data.elasticsearch;
1818

19+
import java.util.Collections;
20+
1921
import org.elasticsearch.action.support.IndicesOptions;
2022
import org.elasticsearch.action.support.WriteRequest;
2123
import org.elasticsearch.client.RestHighLevelClient;
@@ -31,6 +33,7 @@
3133
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchOperations;
3234
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchTemplate;
3335
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
36+
import org.springframework.data.elasticsearch.core.convert.ElasticsearchCustomConversions;
3437
import org.springframework.data.elasticsearch.core.convert.MappingElasticsearchConverter;
3538
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
3639
import org.springframework.web.reactive.function.client.WebClient;
@@ -43,6 +46,7 @@
4346
*
4447
* @author Brian Clozel
4548
* @author Scott Frederick
49+
* @author Stephane Nicoll
4650
*/
4751
abstract class ElasticsearchDataConfiguration {
4852

@@ -51,14 +55,26 @@ static class BaseConfiguration {
5155

5256
@Bean
5357
@ConditionalOnMissingBean
54-
ElasticsearchConverter elasticsearchConverter(SimpleElasticsearchMappingContext mappingContext) {
55-
return new MappingElasticsearchConverter(mappingContext);
58+
ElasticsearchCustomConversions elasticsearchCustomConversions() {
59+
return new ElasticsearchCustomConversions(Collections.emptyList());
60+
}
61+
62+
@Bean
63+
@ConditionalOnMissingBean
64+
SimpleElasticsearchMappingContext mappingContext(
65+
ElasticsearchCustomConversions elasticsearchCustomConversions) {
66+
SimpleElasticsearchMappingContext mappingContext = new SimpleElasticsearchMappingContext();
67+
mappingContext.setSimpleTypeHolder(elasticsearchCustomConversions.getSimpleTypeHolder());
68+
return mappingContext;
5669
}
5770

5871
@Bean
5972
@ConditionalOnMissingBean
60-
SimpleElasticsearchMappingContext mappingContext() {
61-
return new SimpleElasticsearchMappingContext();
73+
ElasticsearchConverter elasticsearchConverter(SimpleElasticsearchMappingContext mappingContext,
74+
ElasticsearchCustomConversions elasticsearchCustomConversions) {
75+
MappingElasticsearchConverter converter = new MappingElasticsearchConverter(mappingContext);
76+
converter.setConversions(elasticsearchCustomConversions);
77+
return converter;
6278
}
6379

6480
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/elasticsearch/ElasticsearchDataAutoConfigurationTests.java

Lines changed: 50 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2012-2020 the original author or authors.
2+
* Copyright 2012-2021 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -16,6 +16,10 @@
1616

1717
package org.springframework.boot.autoconfigure.data.elasticsearch;
1818

19+
import java.math.BigDecimal;
20+
import java.util.Collections;
21+
22+
import org.assertj.core.api.InstanceOfAssertFactories;
1923
import org.junit.jupiter.api.AfterEach;
2024
import org.junit.jupiter.api.BeforeEach;
2125
import org.junit.jupiter.api.Test;
@@ -25,9 +29,13 @@
2529
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
2630
import org.springframework.context.annotation.Bean;
2731
import org.springframework.context.annotation.Configuration;
32+
import org.springframework.core.convert.converter.Converter;
2833
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
2934
import org.springframework.data.elasticsearch.core.ReactiveElasticsearchTemplate;
3035
import org.springframework.data.elasticsearch.core.convert.ElasticsearchConverter;
36+
import org.springframework.data.elasticsearch.core.convert.ElasticsearchCustomConversions;
37+
import org.springframework.data.elasticsearch.core.mapping.SimpleElasticsearchMappingContext;
38+
import org.springframework.data.mapping.model.SimpleTypeHolder;
3139

3240
import static org.assertj.core.api.Assertions.assertThat;
3341
import static org.mockito.Mockito.mock;
@@ -40,10 +48,11 @@
4048
* @author Brian Clozel
4149
* @author Peter-Josef Meisch
4250
* @author Scott Frederick
51+
* @author Stephane Nicoll
4352
*/
4453
class ElasticsearchDataAutoConfigurationTests {
4554

46-
private ApplicationContextRunner contextRunner = new ApplicationContextRunner()
55+
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
4756
.withConfiguration(AutoConfigurations.of(ElasticsearchRestClientAutoConfiguration.class,
4857
ReactiveElasticsearchRestClientAutoConfiguration.class, ElasticsearchDataAutoConfiguration.class));
4958

@@ -61,7 +70,26 @@ void tearDown() {
6170
void defaultRestBeansRegistered() {
6271
this.contextRunner.run((context) -> assertThat(context).hasSingleBean(ElasticsearchRestTemplate.class)
6372
.hasSingleBean(ReactiveElasticsearchTemplate.class).hasSingleBean(ElasticsearchConverter.class)
64-
.hasSingleBean(ElasticsearchConverter.class));
73+
.hasSingleBean(ElasticsearchConverter.class).hasSingleBean(ElasticsearchCustomConversions.class));
74+
}
75+
76+
@Test
77+
void defaultConversionsRegisterBigDecimalAsSimpleType() {
78+
this.contextRunner.run((context) -> {
79+
SimpleElasticsearchMappingContext mappingContext = context.getBean(SimpleElasticsearchMappingContext.class);
80+
assertThat(mappingContext)
81+
.extracting("simpleTypeHolder", InstanceOfAssertFactories.type(SimpleTypeHolder.class)).satisfies(
82+
(simpleTypeHolder) -> assertThat(simpleTypeHolder.isSimpleType(BigDecimal.class)).isTrue());
83+
});
84+
}
85+
86+
@Test
87+
void customConversionsShouldBeUsed() {
88+
this.contextRunner.withUserConfiguration(CustomElasticsearchCustomConversions.class).run((context) -> {
89+
assertThat(context).hasSingleBean(ElasticsearchCustomConversions.class).hasBean("testCustomConversions");
90+
assertThat(context.getBean(ElasticsearchConverter.class).getConversionService()
91+
.canConvert(ElasticsearchRestTemplate.class, Boolean.class)).isTrue();
92+
});
6593
}
6694

6795
@Test
@@ -77,6 +105,16 @@ void customReactiveRestTemplateShouldBeUsed() {
77105
.contains("reactiveElasticsearchTemplate"));
78106
}
79107

108+
@Configuration(proxyBeanMethods = false)
109+
static class CustomElasticsearchCustomConversions {
110+
111+
@Bean
112+
ElasticsearchCustomConversions testCustomConversions() {
113+
return new ElasticsearchCustomConversions(Collections.singletonList(new MyConverter()));
114+
}
115+
116+
}
117+
80118
@Configuration(proxyBeanMethods = false)
81119
static class CustomRestTemplate {
82120

@@ -97,4 +135,13 @@ ReactiveElasticsearchTemplate reactiveElasticsearchTemplate() {
97135

98136
}
99137

138+
static class MyConverter implements Converter<ElasticsearchRestTemplate, Boolean> {
139+
140+
@Override
141+
public Boolean convert(ElasticsearchRestTemplate source) {
142+
return null;
143+
}
144+
145+
}
146+
100147
}

0 commit comments

Comments
 (0)