Allow to override Couchbase's CustomConversions
Closes gh-7700
This commit is contained in:
		
							parent
							
								
									73a45797c0
								
							
						
					
					
						commit
						851ce2286f
					
				|  | @ -30,6 +30,7 @@ import org.springframework.data.couchbase.config.AbstractCouchbaseDataConfigurat | ||||||
| import org.springframework.data.couchbase.config.BeanNames; | import org.springframework.data.couchbase.config.BeanNames; | ||||||
| import org.springframework.data.couchbase.config.CouchbaseConfigurer; | import org.springframework.data.couchbase.config.CouchbaseConfigurer; | ||||||
| import org.springframework.data.couchbase.core.CouchbaseTemplate; | 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.mapping.Document; | ||||||
| import org.springframework.data.couchbase.core.query.Consistency; | import org.springframework.data.couchbase.core.query.Consistency; | ||||||
| import org.springframework.data.couchbase.repository.support.IndexManager; | import org.springframework.data.couchbase.repository.support.IndexManager; | ||||||
|  | @ -81,6 +82,13 @@ class SpringBootCouchbaseDataConfiguration extends AbstractCouchbaseDataConfigur | ||||||
| 		return super.couchbaseTemplate(); | 		return super.couchbaseTemplate(); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	@Override | ||||||
|  | 	@ConditionalOnMissingBean(name = BeanNames.COUCHBASE_CUSTOM_CONVERSIONS) | ||||||
|  | 	@Bean(name = BeanNames.COUCHBASE_CUSTOM_CONVERSIONS) | ||||||
|  | 	public CustomConversions customConversions() { | ||||||
|  | 		return super.customConversions(); | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	@Override | 	@Override | ||||||
| 	@ConditionalOnMissingBean(name = BeanNames.COUCHBASE_INDEX_MANAGER) | 	@ConditionalOnMissingBean(name = BeanNames.COUCHBASE_INDEX_MANAGER) | ||||||
| 	@Bean(name = BeanNames.COUCHBASE_INDEX_MANAGER) | 	@Bean(name = BeanNames.COUCHBASE_INDEX_MANAGER) | ||||||
|  |  | ||||||
|  | @ -16,6 +16,7 @@ | ||||||
| 
 | 
 | ||||||
| package org.springframework.boot.autoconfigure.data.couchbase; | package org.springframework.boot.autoconfigure.data.couchbase; | ||||||
| 
 | 
 | ||||||
|  | import java.util.Collections; | ||||||
| import java.util.Set; | import java.util.Set; | ||||||
| 
 | 
 | ||||||
| import org.junit.After; | import org.junit.After; | ||||||
|  | @ -23,17 +24,22 @@ import org.junit.Test; | ||||||
| 
 | 
 | ||||||
| import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; | import org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration; | ||||||
| import org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration; | 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.couchbase.CouchbaseTestConfigurer; | ||||||
| import org.springframework.boot.autoconfigure.data.couchbase.city.City; | import org.springframework.boot.autoconfigure.data.couchbase.city.City; | ||||||
| import org.springframework.boot.autoconfigure.domain.EntityScan; | import org.springframework.boot.autoconfigure.domain.EntityScan; | ||||||
| import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration; | import org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration; | ||||||
| import org.springframework.boot.test.util.EnvironmentTestUtils; | import org.springframework.boot.test.util.EnvironmentTestUtils; | ||||||
| import org.springframework.context.annotation.AnnotationConfigApplicationContext; | import org.springframework.context.annotation.AnnotationConfigApplicationContext; | ||||||
|  | import org.springframework.context.annotation.Bean; | ||||||
| import org.springframework.context.annotation.Configuration; | import org.springframework.context.annotation.Configuration; | ||||||
| import org.springframework.context.annotation.Import; | 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.AbstractCouchbaseDataConfiguration; | ||||||
|  | import org.springframework.data.couchbase.config.BeanNames; | ||||||
| import org.springframework.data.couchbase.config.CouchbaseConfigurer; | import org.springframework.data.couchbase.config.CouchbaseConfigurer; | ||||||
| import org.springframework.data.couchbase.core.CouchbaseTemplate; | 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.CouchbaseMappingContext; | ||||||
| import org.springframework.data.couchbase.core.mapping.event.ValidatingCouchbaseEventListener; | import org.springframework.data.couchbase.core.mapping.event.ValidatingCouchbaseEventListener; | ||||||
| import org.springframework.data.couchbase.core.query.Consistency; | import org.springframework.data.couchbase.core.query.Consistency; | ||||||
|  | @ -119,6 +125,14 @@ public class CouchbaseDataAutoConfigurationTests { | ||||||
| 		assertThat(initialEntitySet).containsOnly(City.class); | 		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) { | 	private void load(Class<?> config, String... environment) { | ||||||
| 		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); | 		AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); | ||||||
| 		EnvironmentTestUtils.addEnvironment(context, environment); | 		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 | 	@Configuration | ||||||
| 	@EntityScan("org.springframework.boot.autoconfigure.data.couchbase.city") | 	@EntityScan("org.springframework.boot.autoconfigure.data.couchbase.city") | ||||||
| 	@Import(CustomCouchbaseConfiguration.class) | 	@Import(CustomCouchbaseConfiguration.class) | ||||||
|  | @ -154,4 +179,12 @@ public class CouchbaseDataAutoConfigurationTests { | ||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	static class MyConverter implements Converter<CouchbaseProperties, Boolean> { | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public Boolean convert(CouchbaseProperties value) { | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -3789,10 +3789,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 | 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 | 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 | happens when you enable the couchbase support as explained above). | ||||||
| bypass the auto-configuration for Spring Data Couchbase, provide your own |  | ||||||
| `org.springframework.data.couchbase.config.AbstractCouchbaseDataConfiguration` |  | ||||||
| implementation. |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| [source,java,indent=0] | [source,java,indent=0] | ||||||
|  | @ -3812,8 +3809,35 @@ implementation. | ||||||
| 	} | 	} | ||||||
| ---- | ---- | ||||||
| 
 | 
 | ||||||
| If you add a `@Bean` of your own of type `CouchbaseTemplate` named `couchbaseTemplate` it | There are a few beans that you can define in your own configuration to override those | ||||||
| will replace the default. | 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. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue