Skip to content

Commit 8a6e79d

Browse files
committed
Configure Couchbase to use the application's ObjectMapper
Closes gh-24616
1 parent 45f298b commit 8a6e79d

File tree

2 files changed

+73
-2
lines changed

2 files changed

+73
-2
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfiguration.java

+41-1
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.
@@ -27,18 +27,24 @@
2727
import com.couchbase.client.core.env.TimeoutConfig;
2828
import com.couchbase.client.java.Cluster;
2929
import com.couchbase.client.java.ClusterOptions;
30+
import com.couchbase.client.java.codec.JacksonJsonSerializer;
3031
import com.couchbase.client.java.env.ClusterEnvironment;
3132
import com.couchbase.client.java.env.ClusterEnvironment.Builder;
33+
import com.fasterxml.jackson.databind.ObjectMapper;
3234

3335
import org.springframework.beans.factory.ObjectProvider;
36+
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3437
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3538
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3639
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3740
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
41+
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
3842
import org.springframework.boot.autoconfigure.couchbase.CouchbaseProperties.Timeouts;
43+
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
3944
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4045
import org.springframework.context.annotation.Bean;
4146
import org.springframework.context.annotation.Configuration;
47+
import org.springframework.core.Ordered;
4248
import org.springframework.util.ResourceUtils;
4349

4450
/**
@@ -50,6 +56,7 @@
5056
* @since 1.4.0
5157
*/
5258
@Configuration(proxyBeanMethods = false)
59+
@AutoConfigureAfter(JacksonAutoConfiguration.class)
5360
@ConditionalOnClass(Cluster.class)
5461
@ConditionalOnProperty("spring.couchbase.connection-string")
5562
@EnableConfigurationProperties(CouchbaseProperties.class)
@@ -111,4 +118,37 @@ private KeyStore loadKeyStore(String resource, String keyStorePassword) throws E
111118
return store;
112119
}
113120

121+
@Configuration(proxyBeanMethods = false)
122+
@ConditionalOnClass(ObjectMapper.class)
123+
static class JacksonConfiguration {
124+
125+
@Bean
126+
@ConditionalOnSingleCandidate(ObjectMapper.class)
127+
ClusterEnvironmentBuilderCustomizer cluster(ObjectMapper objectMapper) {
128+
return new JacksonClusterEnvironmentBuilderCustomizer(objectMapper);
129+
}
130+
131+
}
132+
133+
private static final class JacksonClusterEnvironmentBuilderCustomizer
134+
implements ClusterEnvironmentBuilderCustomizer, Ordered {
135+
136+
private final ObjectMapper objectMapper;
137+
138+
private JacksonClusterEnvironmentBuilderCustomizer(ObjectMapper objectMapper) {
139+
this.objectMapper = objectMapper;
140+
}
141+
142+
@Override
143+
public void customize(Builder builder) {
144+
builder.jsonSerializer(JacksonJsonSerializer.create(this.objectMapper));
145+
}
146+
147+
@Override
148+
public int getOrder() {
149+
return 0;
150+
}
151+
152+
}
153+
114154
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/couchbase/CouchbaseAutoConfigurationTests.java

+32-1
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.
@@ -23,15 +23,20 @@
2323
import com.couchbase.client.core.env.SecurityConfig;
2424
import com.couchbase.client.core.env.TimeoutConfig;
2525
import com.couchbase.client.java.Cluster;
26+
import com.couchbase.client.java.codec.JacksonJsonSerializer;
27+
import com.couchbase.client.java.codec.JsonSerializer;
2628
import com.couchbase.client.java.env.ClusterEnvironment;
29+
import com.fasterxml.jackson.databind.ObjectMapper;
2730
import org.junit.jupiter.api.Test;
2831

2932
import org.springframework.boot.autoconfigure.AutoConfigurations;
33+
import org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration;
3034
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
3135
import org.springframework.context.annotation.Bean;
3236
import org.springframework.context.annotation.Configuration;
3337

3438
import static org.assertj.core.api.Assertions.assertThat;
39+
import static org.mockito.Mockito.mock;
3540

3641
/**
3742
* Tests for {@link CouchbaseAutoConfiguration}.
@@ -60,6 +65,32 @@ void connectionStringCreateEnvironmentAndCluster() {
6065
});
6166
}
6267

68+
@Test
69+
void environmentUseObjectMapperByDefault() {
70+
this.contextRunner.withUserConfiguration(CouchbaseTestConfiguration.class)
71+
.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
72+
.withPropertyValues("spring.couchbase.connection-string=localhost").run((context) -> {
73+
ClusterEnvironment env = context.getBean(ClusterEnvironment.class);
74+
JsonSerializer serializer = env.jsonSerializer();
75+
assertThat(serializer).isInstanceOf(JacksonJsonSerializer.class)
76+
.hasFieldOrPropertyWithValue("mapper", context.getBean(ObjectMapper.class));
77+
});
78+
}
79+
80+
@Test
81+
void customizeJsonSerializer() {
82+
JsonSerializer customJsonSerializer = mock(JsonSerializer.class);
83+
this.contextRunner.withUserConfiguration(CouchbaseTestConfiguration.class)
84+
.withConfiguration(AutoConfigurations.of(JacksonAutoConfiguration.class))
85+
.withBean(ClusterEnvironmentBuilderCustomizer.class,
86+
() -> (builder) -> builder.jsonSerializer(customJsonSerializer))
87+
.withPropertyValues("spring.couchbase.connection-string=localhost").run((context) -> {
88+
ClusterEnvironment env = context.getBean(ClusterEnvironment.class);
89+
JsonSerializer serializer = env.jsonSerializer();
90+
assertThat(serializer).isSameAs(customJsonSerializer);
91+
});
92+
}
93+
6394
@Test
6495
void customizeEnvIo() {
6596
testClusterEnvironment((env) -> {

0 commit comments

Comments
 (0)