From d1a44dfacdd12fa0503900a3d4680ab30b298985 Mon Sep 17 00:00:00 2001 From: Grudi Radev Date: Fri, 17 Jan 2020 22:15:31 +0200 Subject: [PATCH 1/2] Add support for Spring Data Couchbase custom type key See gh-19789 --- .../data/couchbase/CouchbaseDataProperties.java | 15 +++++++++++++++ .../SpringBootCouchbaseDataConfiguration.java | 5 +++++ .../CouchbaseDataAutoConfigurationTests.java | 17 +++++++++++++++++ 3 files changed, 37 insertions(+) diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataProperties.java index 04435708289..5d1a0250c32 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataProperties.java @@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.data.couchbase; import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.data.couchbase.core.convert.DefaultCouchbaseTypeMapper; import org.springframework.data.couchbase.core.query.Consistency; /** @@ -39,6 +40,12 @@ public class CouchbaseDataProperties { */ private Consistency consistency = Consistency.READ_YOUR_OWN_WRITES; + /** + * Name of the field that will store the type information for complex types when using + * MappingCouchbaseConverter. + */ + private String typeKey = DefaultCouchbaseTypeMapper.DEFAULT_TYPE_KEY; + public boolean isAutoIndex() { return this.autoIndex; } @@ -55,4 +62,12 @@ public class CouchbaseDataProperties { this.consistency = consistency; } + public String getTypeKey() { + return this.typeKey; + } + + public void setTypeKey(String typeKey) { + this.typeKey = typeKey; + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java index 1c1b1294255..6a735370d52 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java @@ -97,4 +97,9 @@ class SpringBootCouchbaseDataConfiguration extends AbstractCouchbaseDataConfigur return new IndexManager(false, false, false); } + @Override + public String typeKey() { + return this.properties.getTypeKey(); + } + } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java index 93f420cfe55..1949e3dd431 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java @@ -40,6 +40,7 @@ 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.CouchbaseCustomConversions; +import org.springframework.data.couchbase.core.convert.DefaultCouchbaseTypeMapper; 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; @@ -127,6 +128,22 @@ class CouchbaseDataAutoConfigurationTests { .isTrue(); } + @Test + void typeKeyIsClassByDefault() { + load(CouchbaseTestConfigurer.class); + AbstractCouchbaseDataConfiguration couchbaseDataConfiguration = this.context + .getBean(AbstractCouchbaseDataConfiguration.class); + assertThat(couchbaseDataConfiguration.typeKey()).isEqualTo(DefaultCouchbaseTypeMapper.DEFAULT_TYPE_KEY); + } + + @Test + void customTypeKey() { + load(CouchbaseTestConfigurer.class, "spring.data.couchbase.type-key=custom"); + AbstractCouchbaseDataConfiguration couchbaseDataConfiguration = this.context + .getBean(AbstractCouchbaseDataConfiguration.class); + assertThat(couchbaseDataConfiguration.typeKey()).isEqualTo("custom"); + } + private void load(Class config, String... environment) { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); TestPropertyValues.of(environment).applyTo(context); From af4fdf0d6ddcb86f1b522e8f7a74480e46286350 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Mon, 27 Jan 2020 11:09:41 +0100 Subject: [PATCH 2/2] Polish "Add support for Spring Data Couchbase custom type key" See gh-19789 --- .../couchbase/CouchbaseDataProperties.java | 6 +-- .../SpringBootCouchbaseDataConfiguration.java | 12 +++--- .../CouchbaseDataAutoConfigurationTests.java | 29 +++++++-------- .../CouchbaseDataPropertiesTests.java | 37 +++++++++++++++++++ 4 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataPropertiesTests.java diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataProperties.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataProperties.java index 5d1a0250c32..f7930803b8c 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataProperties.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataProperties.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,8 +41,8 @@ public class CouchbaseDataProperties { private Consistency consistency = Consistency.READ_YOUR_OWN_WRITES; /** - * Name of the field that will store the type information for complex types when using - * MappingCouchbaseConverter. + * Name of the field that stores the type information for complex types when using + * "MappingCouchbaseConverter". */ private String typeKey = DefaultCouchbaseTypeMapper.DEFAULT_TYPE_KEY; diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java index 6a735370d52..b6b4dd48dbb 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/couchbase/SpringBootCouchbaseDataConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -73,6 +73,11 @@ class SpringBootCouchbaseDataConfiguration extends AbstractCouchbaseDataConfigur return new EntityScanner(this.applicationContext).scan(Document.class, Persistent.class); } + @Override + public String typeKey() { + return this.properties.getTypeKey(); + } + @Override @ConditionalOnMissingBean(name = BeanNames.COUCHBASE_TEMPLATE) @Bean(name = BeanNames.COUCHBASE_TEMPLATE) @@ -97,9 +102,4 @@ class SpringBootCouchbaseDataConfiguration extends AbstractCouchbaseDataConfigur return new IndexManager(false, false, false); } - @Override - public String typeKey() { - return this.properties.getTypeKey(); - } - } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java index 1949e3dd431..19305d0f173 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataAutoConfigurationTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2012-2019 the original author or authors. + * Copyright 2012-2020 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -121,27 +121,24 @@ class CouchbaseDataAutoConfigurationTests { } @Test - void customConversions() { - load(CustomConversionsConfig.class); - CouchbaseTemplate template = this.context.getBean(CouchbaseTemplate.class); - assertThat(template.getConverter().getConversionService().canConvert(CouchbaseProperties.class, Boolean.class)) - .isTrue(); + void typeKeyDefault() { + load(CouchbaseTestConfigurer.class); + assertThat(this.context.getBean(AbstractCouchbaseDataConfiguration.class).typeKey()) + .isEqualTo(DefaultCouchbaseTypeMapper.DEFAULT_TYPE_KEY); } @Test - void typeKeyIsClassByDefault() { - load(CouchbaseTestConfigurer.class); - AbstractCouchbaseDataConfiguration couchbaseDataConfiguration = this.context - .getBean(AbstractCouchbaseDataConfiguration.class); - assertThat(couchbaseDataConfiguration.typeKey()).isEqualTo(DefaultCouchbaseTypeMapper.DEFAULT_TYPE_KEY); + void typeKeyCanBeCustomized() { + load(CouchbaseTestConfigurer.class, "spring.data.couchbase.type-key=_custom"); + assertThat(this.context.getBean(AbstractCouchbaseDataConfiguration.class).typeKey()).isEqualTo("_custom"); } @Test - void customTypeKey() { - load(CouchbaseTestConfigurer.class, "spring.data.couchbase.type-key=custom"); - AbstractCouchbaseDataConfiguration couchbaseDataConfiguration = this.context - .getBean(AbstractCouchbaseDataConfiguration.class); - assertThat(couchbaseDataConfiguration.typeKey()).isEqualTo("custom"); + 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) { diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataPropertiesTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataPropertiesTests.java new file mode 100644 index 00000000000..3a26c7c9229 --- /dev/null +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/couchbase/CouchbaseDataPropertiesTests.java @@ -0,0 +1,37 @@ +/* + * Copyright 2012-2020 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.autoconfigure.data.couchbase; + +import org.junit.jupiter.api.Test; + +import org.springframework.data.couchbase.config.CouchbaseConfigurationSupport; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Tests for {@link CouchbaseDataProperties}. + * + * @author Stephane Nicoll + */ +class CouchbaseDataPropertiesTests { + + @Test + void typeKeyHasConsistentDefault() { + assertThat(new CouchbaseDataProperties().getTypeKey()).isEqualTo(new CouchbaseConfigurationSupport().typeKey()); + } + +}