Skip to content

Commit a92b177

Browse files
committed
Polish "Upgrade to Elasticsearch Client 9.2.0"
This commit configures the new Jackson 3 support for Elasticsearch if available. As for other auto-configurations, Jackson 2 is still supported in a deprecated fashion. Closes gh-47847
1 parent 18335a6 commit a92b177

File tree

3 files changed

+49
-7
lines changed

3 files changed

+49
-7
lines changed

module/spring-boot-elasticsearch/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ dependencies {
4242
exclude group: "org.elasticsearch.client", module: "transport"
4343
}
4444
optional("org.testcontainers:testcontainers-elasticsearch")
45+
optional("tools.jackson.core:jackson-databind")
4546

4647
dockerTestImplementation(project(":core:spring-boot-test"))
4748
dockerTestImplementation(project(":module:spring-boot-jackson"))

module/spring-boot-elasticsearch/src/main/java/org/springframework/boot/elasticsearch/autoconfigure/ElasticsearchClientConfigurations.java

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import co.elastic.clients.elasticsearch.ElasticsearchClient;
2020
import co.elastic.clients.json.JsonpMapper;
2121
import co.elastic.clients.json.SimpleJsonpMapper;
22+
import co.elastic.clients.json.jackson.Jackson3JsonpMapper;
2223
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
2324
import co.elastic.clients.json.jsonb.JsonbJsonpMapper;
2425
import co.elastic.clients.transport.ElasticsearchTransport;
@@ -28,6 +29,7 @@
2829
import com.fasterxml.jackson.databind.ObjectMapper;
2930
import jakarta.json.bind.Jsonb;
3031
import jakarta.json.spi.JsonProvider;
32+
import tools.jackson.databind.json.JsonMapper;
3133

3234
import org.springframework.beans.factory.ObjectProvider;
3335
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
@@ -44,17 +46,30 @@
4446
*/
4547
class ElasticsearchClientConfigurations {
4648

47-
@Import({ JacksonJsonpMapperConfiguration.class, JsonbJsonpMapperConfiguration.class,
48-
SimpleJsonpMapperConfiguration.class })
49+
@Import({ JacksonJsonpMapperConfiguration.class, Jackson2JsonpMapperConfiguration.class,
50+
JsonbJsonpMapperConfiguration.class, SimpleJsonpMapperConfiguration.class })
4951
static class JsonpMapperConfiguration {
5052

5153
}
5254

53-
@ConditionalOnMissingBean(JsonpMapper.class)
54-
@ConditionalOnClass(ObjectMapper.class)
5555
@Configuration(proxyBeanMethods = false)
56+
@ConditionalOnMissingBean(JsonpMapper.class)
57+
@ConditionalOnClass(JsonMapper.class)
5658
static class JacksonJsonpMapperConfiguration {
5759

60+
@Bean
61+
Jackson3JsonpMapper jacksonJsonpMapper() {
62+
return new Jackson3JsonpMapper();
63+
}
64+
65+
}
66+
67+
@Configuration(proxyBeanMethods = false)
68+
@ConditionalOnMissingBean(JsonpMapper.class)
69+
@ConditionalOnClass(ObjectMapper.class)
70+
@Deprecated(since = "4.0.0", forRemoval = true)
71+
static class Jackson2JsonpMapperConfiguration {
72+
5873
@Bean
5974
JacksonJsonpMapper jacksonJsonpMapper() {
6075
return new JacksonJsonpMapper();

module/spring-boot-elasticsearch/src/test/java/org/springframework/boot/elasticsearch/autoconfigure/ElasticsearchClientAutoConfigurationTests.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,15 @@
1919
import co.elastic.clients.elasticsearch.ElasticsearchClient;
2020
import co.elastic.clients.json.JsonpMapper;
2121
import co.elastic.clients.json.SimpleJsonpMapper;
22+
import co.elastic.clients.json.jackson.Jackson3JsonpMapper;
2223
import co.elastic.clients.json.jackson.JacksonJsonpMapper;
2324
import co.elastic.clients.json.jsonb.JsonbJsonpMapper;
2425
import co.elastic.clients.transport.ElasticsearchTransport;
2526
import co.elastic.clients.transport.rest5_client.Rest5ClientTransport;
2627
import co.elastic.clients.transport.rest5_client.low_level.Rest5Client;
2728
import com.fasterxml.jackson.databind.ObjectMapper;
2829
import org.junit.jupiter.api.Test;
30+
import tools.jackson.databind.json.JsonMapper;
2931

3032
import org.springframework.boot.autoconfigure.AutoConfigurations;
3133
import org.springframework.boot.jackson.autoconfigure.JacksonAutoConfiguration;
@@ -65,15 +67,15 @@ void withRestClientAutoConfigurationShouldDefineClientAndSupportingBeans() {
6567

6668
@Test
6769
void withoutJsonbOrJacksonShouldDefineSimpleMapper() {
68-
this.contextRunner.withClassLoader(new FilteredClassLoader(ObjectMapper.class))
70+
this.contextRunner.withClassLoader(new FilteredClassLoader(JsonMapper.class, ObjectMapper.class))
6971
.withUserConfiguration(RestClientConfiguration.class)
7072
.run((context) -> assertThat(context).hasSingleBean(JsonpMapper.class)
7173
.hasSingleBean(SimpleJsonpMapper.class));
7274
}
7375

7476
@Test
7577
void withJsonbShouldDefineJsonbMapper() {
76-
this.contextRunner.withClassLoader(new FilteredClassLoader(ObjectMapper.class))
78+
this.contextRunner.withClassLoader(new FilteredClassLoader(JsonMapper.class, ObjectMapper.class))
7779
.withConfiguration(AutoConfigurations.of(JsonbAutoConfiguration.class))
7880
.withUserConfiguration(RestClientConfiguration.class)
7981
.run((context) -> assertThat(context).hasSingleBean(JsonpMapper.class)
@@ -83,6 +85,16 @@ void withJsonbShouldDefineJsonbMapper() {
8385
@Test
8486
void withJacksonShouldDefineJacksonMapper() {
8587
this.contextRunner.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
88+
.withUserConfiguration(RestClientConfiguration.class)
89+
.run((context) -> assertThat(context).hasSingleBean(JsonpMapper.class)
90+
.hasSingleBean(Jackson3JsonpMapper.class));
91+
}
92+
93+
@Test
94+
@Deprecated(since = "4.0.0", forRemoval = true)
95+
void withoutJackson3ShouldDefineJackson2Mapper() {
96+
this.contextRunner.withClassLoader(new FilteredClassLoader(JsonMapper.class))
97+
.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
8698
.withUserConfiguration(RestClientConfiguration.class)
8799
.run((context) -> assertThat(context).hasSingleBean(JsonpMapper.class)
88100
.hasSingleBean(JacksonJsonpMapper.class));
@@ -94,7 +106,7 @@ void withJacksonAndJsonbShouldDefineJacksonMapper() {
94106
.withConfiguration(AutoConfigurations.of(JsonbAutoConfiguration.class, JacksonAutoConfiguration.class))
95107
.withUserConfiguration(RestClientConfiguration.class)
96108
.run((context) -> assertThat(context).hasSingleBean(JsonpMapper.class)
97-
.hasSingleBean(JacksonJsonpMapper.class));
109+
.hasSingleBean(Jackson3JsonpMapper.class));
98110
}
99111

100112
@Test
@@ -122,6 +134,20 @@ void withCustomTransportClientShouldUseIt() {
122134
@Test
123135
void jacksonJsonpMapperDoesNotUseGlobalObjectMapper() {
124136
this.contextRunner.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
137+
.withUserConfiguration(RestClientConfiguration.class)
138+
.withBean(ObjectMapper.class)
139+
.run((context) -> {
140+
JsonMapper jsonMapper = context.getBean(JsonMapper.class);
141+
Jackson3JsonpMapper jacksonJsonpMapper = context.getBean(Jackson3JsonpMapper.class);
142+
assertThat(jacksonJsonpMapper.objectMapper()).isNotSameAs(jsonMapper);
143+
});
144+
}
145+
146+
@Test
147+
@Deprecated(since = "4.0.0", forRemoval = true)
148+
void jackson2JsonpMapperDoesNotUseGlobalObjectMapper() {
149+
this.contextRunner.withClassLoader(new FilteredClassLoader(JsonMapper.class))
150+
.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
125151
.withUserConfiguration(RestClientConfiguration.class)
126152
.withBean(ObjectMapper.class)
127153
.run((context) -> {

0 commit comments

Comments
 (0)