diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java index 7ecae7bdbd6..9e210703c2e 100644 --- a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java +++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java @@ -30,6 +30,7 @@ import org.springframework.data.couchbase.config.AbstractCouchbaseDataConfigurat import org.springframework.data.couchbase.config.BeanNames; import org.springframework.data.couchbase.config.CouchbaseConfigurer; import org.springframework.data.couchbase.core.CouchbaseTemplate; +import org.springframework.data.couchbase.core.convert.CustomConversions; import org.springframework.data.couchbase.core.mapping.Document; import org.springframework.data.couchbase.core.query.Consistency; import org.springframework.data.couchbase.repository.support.IndexManager; @@ -81,6 +82,13 @@ class SpringBootCouchbaseDataConfiguration extends AbstractCouchbaseDataConfigur return super.couchbaseTemplate(); } + @Override + @ConditionalOnMissingBean(name = BeanNames.COUCHBASE_CUSTOM_CONVERSIONS) + @Bean(name = BeanNames.COUCHBASE_CUSTOM_CONVERSIONS) + public CustomConversions customConversions() { + return super.customConversions(); + } + @Override @ConditionalOnMissingBean(name = BeanNames.COUCHBASE_INDEX_MANAGER) @Bean(name = BeanNames.COUCHBASE_INDEX_MANAGER) diff --git a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java index 8f8bb415aeb..17a6a723a50 100644 --- a/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java +++ b/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java @@ -16,6 +16,7 @@ package org.springframework.boot.autoconfigure.data.couchbase; +import java.util.Collections; import java.util.Set; import org.junit.After; @@ -23,17 +24,22 @@ import org.junit.Test; import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration; +import org.springframework.boot.autoconfigure.couchbase.CouchbaseProperties; import org.springframework.boot.autoconfigure.couchbase.CouchbaseTestConfigurer; import org.springframework.boot.autoconfigure.data.couchbase.city.City; import org.springframework.boot.autoconfigure.domain.EntityScan; import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration; import org.springframework.boot.test.util.EnvironmentTestUtils; import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; +import org.springframework.core.convert.converter.Converter; import org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration; +import org.springframework.data.couchbase.config.BeanNames; import org.springframework.data.couchbase.config.CouchbaseConfigurer; import org.springframework.data.couchbase.core.CouchbaseTemplate; +import org.springframework.data.couchbase.core.convert.CustomConversions; import org.springframework.data.couchbase.core.mapping.CouchbaseMappingContext; import org.springframework.data.couchbase.core.mapping.event.ValidatingCouchbaseEventListener; import org.springframework.data.couchbase.core.query.Consistency; @@ -119,6 +125,14 @@ public class CouchbaseDataAutoConfigurationTests { assertThat(initialEntitySet).containsOnly(City.class); } + @Test + public void customConversions() { + load(CustomConversionsConfig.class); + CouchbaseTemplate template = this.context.getBean(CouchbaseTemplate.class); + assertThat(template.getConverter().getConversionService() + .canConvert(CouchbaseProperties.class, Boolean.class)).isTrue(); + } + private void load(Class config, String... environment) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); EnvironmentTestUtils.addEnvironment(context, environment); @@ -147,6 +161,17 @@ public class CouchbaseDataAutoConfigurationTests { } + @Configuration + @Import(CouchbaseTestConfigurer.class) + static class CustomConversionsConfig { + + @Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS) + public CustomConversions myCustomConversions() { + return new CustomConversions(Collections.singletonList(new MyConverter())); + } + + } + @Configuration @EntityScan("org.springframework.boot.autoconfigure.data.couchbase.city") @Import(CustomCouchbaseConfiguration.class) @@ -154,4 +179,12 @@ public class CouchbaseDataAutoConfigurationTests { } + static class MyConverter implements Converter { + + @Override + public Boolean convert(CouchbaseProperties value) { + return true; + } + } + } diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc index f98bcc58500..5a880451813 100644 --- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc +++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc @@ -3778,10 +3778,7 @@ http://docs.spring.io/spring-data/couchbase/docs/current/reference/html/[referen You can inject an auto-configured `CouchbaseTemplate` instance as you would with any other Spring Bean as long as a _default_ `CouchbaseConfigurer` is available (that -happens when you enable the couchbase support as explained above). If you want to -bypass the auto-configuration for Spring Data Couchbase, provide your own -`org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration` -implementation. +happens when you enable the couchbase support as explained above). [source,java,indent=0] @@ -3801,8 +3798,35 @@ implementation. } ---- -If you add a `@Bean` of your own of type `CouchbaseTemplate` named `couchbaseTemplate` it -will replace the default. +There are a few beans that you can define in your own configuration to override those +provided by the auto-configuration: + +* A `CouchbaseTemplate` `@Bean` with name `couchbaseTemplate` +* An `IndexManager` `@Bean` with name `couchbaseIndexManager` +* A `CustomConversions` `@Bean` with name `couchbaseCustomConversions` + +To avoid hard-coding those names in your own config, you can reuse `BeanNames` provided +by Spring Data Couchbase. For instance, you can customize the converters to use as +follows: + +[source,java,indent=0] +---- + @Configuration + public class SomeConfiguration { + + @Bean(BeanNames.COUCHBASE_CUSTOM_CONVERSIONS) + public CustomConversions myCustomConversions() { + return new CustomConversions(...); + } + + // ... + + } +---- + +TIP: If you want to fully bypass the auto-configuration for Spring Data Couchbase, provide +your own `org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration` +implementation.