From 7d79d79e28525895a40bcc5c5e511afbef9ed938 Mon Sep 17 00:00:00 2001 From: David Harrigan Date: Thu, 17 Oct 2013 15:28:13 +0100 Subject: [PATCH] DATACOUCH-30 - ObjectMapper configuration must be supported Allow for a custom ObjectMapper to be used. --- .../AbstractCouchbaseConfiguration.java | 36 +++++---- .../data/couchbase/config/BeanNames.java | 7 ++ .../config/CouchbaseNamespaceHandler.java | 4 +- .../couchbase/config/CouchbaseParser.java | 29 ++++---- .../config/CouchbaseTemplateParser.java | 16 ++-- .../CouchbaseTranslationServiceParser.java | 74 +++++++++++++++++++ .../couchbase/core/CouchbaseTemplate.java | 26 +++++-- .../JacksonTranslationService.java | 27 ++++++- .../couchbase/config/spring-couchbase-1.0.xsd | 59 +++++++++++---- .../data/couchbase/TestApplicationConfig.java | 6 +- .../AbstractCouchbaseConfigurationTests.java | 7 +- ...uchbaseTemplateParserIntegrationTests.java | 10 +++ .../resources/namespace/couchbase-bean.xml | 6 +- ...template-with-translation-service-bean.xml | 14 ++++ 14 files changed, 252 insertions(+), 69 deletions(-) create mode 100644 src/main/java/org/springframework/data/couchbase/config/CouchbaseTranslationServiceParser.java create mode 100644 src/test/resources/namespace/couchbase-template-with-translation-service-bean.xml diff --git a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java index c83bb0c9..a48a602d 100644 --- a/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java +++ b/src/main/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfiguration.java @@ -25,6 +25,8 @@ import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.data.annotation.Persistent; import org.springframework.data.couchbase.core.CouchbaseTemplate; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; +import org.springframework.data.couchbase.core.convert.translation.JacksonTranslationService; +import org.springframework.data.couchbase.core.convert.translation.TranslationService; import org.springframework.data.couchbase.core.mapping.CouchbaseMappingContext; import org.springframework.data.couchbase.core.mapping.Document; import org.springframework.util.ClassUtils; @@ -56,7 +58,7 @@ public abstract class AbstractCouchbaseConfiguration { */ @Bean public CouchbaseTemplate couchbaseTemplate() throws Exception { - return new CouchbaseTemplate(couchbaseClient(), mappingCouchbaseConverter()); + return new CouchbaseTemplate(couchbaseClient(), mappingCouchbaseConverter(), translationService()); } /** @@ -69,6 +71,18 @@ public abstract class AbstractCouchbaseConfiguration { return new MappingCouchbaseConverter(couchbaseMappingContext()); } + /** + * Creates a {@link TranslationService}. + * + * @return TranslationService, defaulting to JacksonTranslationService. + */ + @Bean + public TranslationService translationService() { + final JacksonTranslationService jacksonTranslationService = new JacksonTranslationService(); + jacksonTranslationService.afterPropertiesSet(); + return jacksonTranslationService; + } + /** * Creates a {@link CouchbaseMappingContext} equipped with entity classes scanned from the mapping base package. * @@ -91,18 +105,12 @@ public abstract class AbstractCouchbaseConfiguration { Set> initialEntitySet = new HashSet>(); if (StringUtils.hasText(basePackage)) { - ClassPathScanningCandidateComponentProvider componentProvider = - new ClassPathScanningCandidateComponentProvider(false); - componentProvider.addIncludeFilter( - new AnnotationTypeFilter(Document.class)); - componentProvider.addIncludeFilter( - new AnnotationTypeFilter(Persistent.class)); - - for (BeanDefinition candidate : - componentProvider.findCandidateComponents(basePackage)) { - initialEntitySet.add(ClassUtils.forName(candidate.getBeanClassName(), - AbstractCouchbaseConfiguration.class.getClassLoader())); - } + ClassPathScanningCandidateComponentProvider componentProvider = new ClassPathScanningCandidateComponentProvider(false); + componentProvider.addIncludeFilter(new AnnotationTypeFilter(Document.class)); + componentProvider.addIncludeFilter(new AnnotationTypeFilter(Persistent.class)); + for (BeanDefinition candidate : componentProvider.findCandidateComponents(basePackage)) { + initialEntitySet.add(ClassUtils.forName(candidate.getBeanClassName(), AbstractCouchbaseConfiguration.class.getClassLoader())); + } } return initialEntitySet; @@ -111,7 +119,7 @@ public abstract class AbstractCouchbaseConfiguration { /** * Return the base package to scan for mapped {@link Document}s. Will return the package name of the configuration * class (the concrete class, not this one here) by default. - * + *

*

So if you have a {@code com.acme.AppConfig} extending {@link AbstractCouchbaseConfiguration} the base package * will be considered {@code com.acme} unless the method is overridden to implement alternate behavior.

* diff --git a/src/main/java/org/springframework/data/couchbase/config/BeanNames.java b/src/main/java/org/springframework/data/couchbase/config/BeanNames.java index 3db93cc6..4e43ec8d 100644 --- a/src/main/java/org/springframework/data/couchbase/config/BeanNames.java +++ b/src/main/java/org/springframework/data/couchbase/config/BeanNames.java @@ -22,6 +22,7 @@ package org.springframework.data.couchbase.config; * @author Michael Nitschinger */ public class BeanNames { + /** * Refers to the "" bean. */ @@ -31,4 +32,10 @@ public class BeanNames { * Refers to the "" bean. */ static final String COUCHBASE_TEMPLATE = "couchbaseTemplate"; + + /** + * Refers to the "" bean + */ + static final String TRANSLATION_SERVICE = "translationService"; + } diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseNamespaceHandler.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseNamespaceHandler.java index 9c260a9c..7a1b0f82 100644 --- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseNamespaceHandler.java +++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseNamespaceHandler.java @@ -23,7 +23,7 @@ import org.springframework.data.repository.config.RepositoryConfigurationExtensi /** * {@link org.springframework.beans.factory.xml.NamespaceHandler} for Couchbase configuration. - * + *

* This handler acts as a container for one or more bean parsers and registers them. During parsing, the elements * get analyzed and the appropriate registered parser is called. * @@ -36,11 +36,11 @@ public class CouchbaseNamespaceHandler extends NamespaceHandlerSupport { */ public final void init() { RepositoryConfigurationExtension extension = new CouchbaseRepositoryConfigurationExtension(); - registerBeanDefinitionParser("repositories", new RepositoryBeanDefinitionParser(extension)); registerBeanDefinitionParser("couchbase", new CouchbaseParser()); registerBeanDefinitionParser("jmx", new CouchbaseJmxParser()); registerBeanDefinitionParser("template", new CouchbaseTemplateParser()); + registerBeanDefinitionParser("translation-service", new CouchbaseTranslationServiceParser()); } } diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseParser.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseParser.java index ce11c9a1..c5de01e7 100644 --- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseParser.java +++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseParser.java @@ -33,7 +33,7 @@ import java.util.List; /** * Parser for "" bean definitions. - * + *

* The outcome of this bean definition parser will be a constructed {@link CouchbaseClient}. * * @author Michael Nitschinger @@ -44,6 +44,7 @@ public class CouchbaseParser extends AbstractSingleBeanDefinitionParser { * Defines the bean class that will be constructed. * * @param element the XML element which contains the attributes. + * * @return the class type to instantiate. */ @Override @@ -60,14 +61,11 @@ public class CouchbaseParser extends AbstractSingleBeanDefinitionParser { @Override protected void doParse(final Element element, final BeanDefinitionBuilder bean) { String host = element.getAttribute("host"); - bean.addConstructorArgValue( - convertHosts(StringUtils.hasText(host) ? host : CouchbaseFactoryBean.DEFAULT_NODE)); + bean.addConstructorArgValue(convertHosts(StringUtils.hasText(host) ? host : CouchbaseFactoryBean.DEFAULT_NODE)); String bucket = element.getAttribute("bucket"); - bean.addConstructorArgValue( - StringUtils.hasText(bucket) ? bucket : CouchbaseFactoryBean.DEFAULT_BUCKET); + bean.addConstructorArgValue(StringUtils.hasText(bucket) ? bucket : CouchbaseFactoryBean.DEFAULT_BUCKET); String password = element.getAttribute("password"); - bean.addConstructorArgValue( - StringUtils.hasText(password) ? password : CouchbaseFactoryBean.DEFAULT_PASSWORD); + bean.addConstructorArgValue(StringUtils.hasText(password) ? password : CouchbaseFactoryBean.DEFAULT_PASSWORD); } /** @@ -76,36 +74,35 @@ public class CouchbaseParser extends AbstractSingleBeanDefinitionParser { * @param element the XML element which contains the attributes. * @param definition the bean definition to work with. * @param parserContext encapsulates the parsing state and configuration. + * * @return the ID to work with. */ @Override - protected String resolveId(final Element element, final AbstractBeanDefinition definition, - final ParserContext parserContext) { + protected String resolveId(final Element element, final AbstractBeanDefinition definition, final ParserContext parserContext) { String id = super.resolveId(element, definition, parserContext); return StringUtils.hasText(id) ? id : BeanNames.COUCHBASE; } /** * Convert a list of hosts into a URI format that can be used by the {@link CouchbaseClient}. - * + *

* To make it simple to use, the list of hosts can be passed in as a comma separated list. This list gets parsed * and converted into a URI format that is suitable for the underlying {@link CouchbaseClient} object. * * @param hosts the host list to convert. + * * @return the converted list with URIs. */ private List convertHosts(final String hosts) { - String[] split = hosts.split(","); - List nodes = new ArrayList(); - + final String[] split = hosts.split(","); + final List nodes = new ArrayList(); try { - for (int i = 0; i < split.length; i++) { - nodes.add(new URI("http://" + split[i] + ":8091/pools")); + for (final String aSplit : split) { + nodes.add(new URI("http://" + aSplit + ":8091/pools")); } } catch (URISyntaxException ex) { throw new BeanCreationException("Could not convert host list." + ex); } - return nodes; } diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseTemplateParser.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseTemplateParser.java index ee85abaa..66a2b0d8 100644 --- a/src/main/java/org/springframework/data/couchbase/config/CouchbaseTemplateParser.java +++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseTemplateParser.java @@ -26,7 +26,7 @@ import org.w3c.dom.Element; /** * Parser for "" bean definitions. - * + *

* The outcome of this bean definition parser will be a constructed {@link CouchbaseTemplate}. * * @author Michael Nitschinger @@ -39,11 +39,11 @@ public class CouchbaseTemplateParser extends AbstractSingleBeanDefinitionParser * @param element the XML element which contains the attributes. * @param definition the bean definition to work with. * @param parserContext encapsulates the parsing state and configuration. + * * @return the ID to work with. */ @Override - protected String resolveId(final Element element, final AbstractBeanDefinition definition, - final ParserContext parserContext) { + protected String resolveId(final Element element, final AbstractBeanDefinition definition, final ParserContext parserContext) { String id = super.resolveId(element, definition, parserContext); return StringUtils.hasText(id) ? id : BeanNames.COUCHBASE_TEMPLATE; } @@ -52,6 +52,7 @@ public class CouchbaseTemplateParser extends AbstractSingleBeanDefinitionParser * Defines the bean class that will be constructed. * * @param element the XML element which contains the attributes. + * * @return the class type to instantiate. */ @Override @@ -67,14 +68,19 @@ public class CouchbaseTemplateParser extends AbstractSingleBeanDefinitionParser */ @Override protected void doParse(final Element element, final BeanDefinitionBuilder bean) { + String clientRef = element.getAttribute("client-ref"); String converterRef = element.getAttribute("converter-ref"); - String dbRef = element.getAttribute("db-ref"); + String translationServiceRef = element.getAttribute("translation-service-ref"); - bean.addConstructorArgReference(StringUtils.hasText(dbRef) ? dbRef : BeanNames.COUCHBASE); + bean.addConstructorArgReference(StringUtils.hasText(clientRef) ? clientRef : BeanNames.COUCHBASE); if (StringUtils.hasText(converterRef)) { bean.addConstructorArgReference(converterRef); } + + if (StringUtils.hasText(translationServiceRef)) { + bean.addConstructorArgReference(translationServiceRef); + } } } diff --git a/src/main/java/org/springframework/data/couchbase/config/CouchbaseTranslationServiceParser.java b/src/main/java/org/springframework/data/couchbase/config/CouchbaseTranslationServiceParser.java new file mode 100644 index 00000000..e879916c --- /dev/null +++ b/src/main/java/org/springframework/data/couchbase/config/CouchbaseTranslationServiceParser.java @@ -0,0 +1,74 @@ +/* + * Copyright 2013 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 + * + * http://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.data.couchbase.config; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.support.AbstractBeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.xml.AbstractSingleBeanDefinitionParser; +import org.springframework.beans.factory.xml.ParserContext; +import org.springframework.data.couchbase.core.convert.translation.JacksonTranslationService; +import org.springframework.util.StringUtils; +import org.w3c.dom.Element; + +/** + * Enables Parsing of the "" configuration bean. + * + * @author David Harrigan + */ +public class CouchbaseTranslationServiceParser extends AbstractSingleBeanDefinitionParser { + + /** + * Defines the bean class that will be constructed. + * + * @param element the XML element which contains the attributes. + * + * @return the class type to instantiate. + */ + @Override + protected Class getBeanClass(final Element element) { + return JacksonTranslationService.class; + } + + /** + * Parse the bean definition and build up the bean. + * + * @param element the XML element which contains the attributes. + * @param bean the builder which builds the bean. + */ + @Override + protected void doParse(final Element element, final BeanDefinitionBuilder bean) { + final String objectMapper = element.getAttribute("objectMapper"); + bean.addPropertyValue("objectMapper", StringUtils.hasText(objectMapper) ? objectMapper : new ObjectMapper()); + } + + /** + * Resolve the bean ID and assign a default if not set. + * + * @param element the XML element which contains the attributes. + * @param definition the bean definition to work with. + * @param parserContext encapsulates the parsing state and configuration. + * + * @return the ID to work with (e.g., "translationService") + */ + @Override + protected String resolveId(final Element element, final AbstractBeanDefinition definition, final ParserContext parserContext) { + String id = super.resolveId(element, definition, parserContext); + return StringUtils.hasText(id) ? id : BeanNames.TRANSLATION_SERVICE; + } + +} diff --git a/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java b/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java index 76099654..0d6a0520 100644 --- a/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java +++ b/src/main/java/org/springframework/data/couchbase/core/CouchbaseTemplate.java @@ -26,6 +26,7 @@ import org.springframework.dao.QueryTimeoutException; import org.springframework.data.couchbase.core.convert.CouchbaseConverter; import org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter; import org.springframework.data.couchbase.core.convert.translation.JacksonTranslationService; +import org.springframework.data.couchbase.core.convert.translation.TranslationService; import org.springframework.data.couchbase.core.mapping.CouchbaseDocument; import org.springframework.data.couchbase.core.mapping.CouchbaseMappingContext; import org.springframework.data.couchbase.core.mapping.CouchbasePersistentEntity; @@ -53,7 +54,7 @@ public class CouchbaseTemplate implements CouchbaseOperations { protected final MappingContext, CouchbasePersistentProperty> mappingContext; private static final Collection ITERABLE_CLASSES; private final CouchbaseExceptionTranslator exceptionTranslator = new CouchbaseExceptionTranslator(); - private final JacksonTranslationService translationService; + private final TranslationService translationService; static { final Set iterableClasses = new HashSet(); @@ -64,14 +65,21 @@ public class CouchbaseTemplate implements CouchbaseOperations { } public CouchbaseTemplate(final CouchbaseClient client) { - this(client, null); + this(client, null, null); } - public CouchbaseTemplate(final CouchbaseClient client, final CouchbaseConverter converter) { + public CouchbaseTemplate(final CouchbaseClient client, final CouchbaseConverter couchbaseConverter, final TranslationService translationService) { this.client = client; - couchbaseConverter = converter == null ? getDefaultConverter() : converter; - mappingContext = couchbaseConverter.getMappingContext(); - translationService = new JacksonTranslationService(); + this.couchbaseConverter = couchbaseConverter == null ? getDefaultConverter() : couchbaseConverter; + this.translationService = translationService == null ? getDefaultTranslationService() : translationService; + mappingContext = this.couchbaseConverter.getMappingContext(); + } + + public CouchbaseTemplate(final CouchbaseClient client, final TranslationService translationService) { + this.client = client; + this.couchbaseConverter = couchbaseConverter == null ? getDefaultConverter() : couchbaseConverter; + this.translationService = translationService == null ? getDefaultTranslationService() : translationService; + mappingContext = this.couchbaseConverter.getMappingContext(); } private CouchbaseConverter getDefaultConverter() { @@ -80,6 +88,12 @@ public class CouchbaseTemplate implements CouchbaseOperations { return converter; } + private TranslationService getDefaultTranslationService() { + final JacksonTranslationService jacksonTranslationService = new JacksonTranslationService(); + jacksonTranslationService.afterPropertiesSet(); + return jacksonTranslationService; + } + private Object translateEncode(final CouchbaseStorable source) { return translationService.encode(source); } diff --git a/src/main/java/org/springframework/data/couchbase/core/convert/translation/JacksonTranslationService.java b/src/main/java/org/springframework/data/couchbase/core/convert/translation/JacksonTranslationService.java index 2f561e0b..1ebb46c8 100644 --- a/src/main/java/org/springframework/data/couchbase/core/convert/translation/JacksonTranslationService.java +++ b/src/main/java/org/springframework/data/couchbase/core/convert/translation/JacksonTranslationService.java @@ -16,8 +16,14 @@ package org.springframework.data.couchbase.core.convert.translation; -import com.fasterxml.jackson.core.*; +import com.fasterxml.jackson.core.JsonEncoding; +import com.fasterxml.jackson.core.JsonFactory; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.InitializingBean; import org.springframework.data.couchbase.core.mapping.CouchbaseDocument; import org.springframework.data.couchbase.core.mapping.CouchbaseList; import org.springframework.data.couchbase.core.mapping.CouchbaseStorable; @@ -32,7 +38,12 @@ import java.util.Map; * * @author Michael Nitschinger */ -public class JacksonTranslationService implements TranslationService { +public class JacksonTranslationService implements TranslationService, InitializingBean { + + /** + * Jackson Object Mapper; + */ + private ObjectMapper objectMapper; /** * Type holder to help easily identify simple types. @@ -92,7 +103,7 @@ public class JacksonTranslationService implements TranslationService { if (simpleTypeHolder.isSimpleType(clazz) && !isEnumOrClass(clazz)) { generator.writeObject(value); } else { - new ObjectMapper().writeValue(generator, value); + objectMapper.writeValue(generator, value); } } @@ -221,5 +232,15 @@ public class JacksonTranslationService implements TranslationService { } } + public void setObjectMapper(final ObjectMapper objectMapper) { + this.objectMapper = objectMapper; + } + + @Override + public void afterPropertiesSet() { + if (objectMapper == null) { + objectMapper = new ObjectMapper(); + } + } } diff --git a/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-1.0.xsd b/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-1.0.xsd index f3a6236f..4c6a998b 100644 --- a/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-1.0.xsd +++ b/src/main/resources/org/springframework/data/couchbase/config/spring-couchbase-1.0.xsd @@ -1,19 +1,15 @@ - - - - + + + + @@ -44,7 +40,19 @@ Defines a CouchbaseClient instance used for accessing a Couchbase Cluster. +The id of the couchbase definition (by default "couchbaseFactory").]]> + + + + + + The reference to a CouchbaseClient object. + + + + + + @@ -60,16 +68,37 @@ The reference to a CouchbaseConverter instance. - + - - The reference to a CouchbaseClient object. + - + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/org/springframework/data/couchbase/TestApplicationConfig.java b/src/test/java/org/springframework/data/couchbase/TestApplicationConfig.java index 5de2b2e5..68c16ace 100644 --- a/src/test/java/org/springframework/data/couchbase/TestApplicationConfig.java +++ b/src/test/java/org/springframework/data/couchbase/TestApplicationConfig.java @@ -66,14 +66,12 @@ public class TestApplicationConfig extends AbstractCouchbaseConfiguration { return new BucketCreator(couchbaseHost(), couchbaseAdminUser(), couchbaseAdminPassword()); } - @Override @Bean + @Override @DependsOn("bucketCreator") public CouchbaseClient couchbaseClient() throws Exception { - return new CouchbaseClient( - Arrays.asList(new URI(couchbaseHost())), couchbaseBucket(), couchbasePassword()); + return new CouchbaseClient(Arrays.asList(new URI(couchbaseHost())), couchbaseBucket(), couchbasePassword()); } - } diff --git a/src/test/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfigurationTests.java b/src/test/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfigurationTests.java index baf204ed..74404778 100644 --- a/src/test/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfigurationTests.java +++ b/src/test/java/org/springframework/data/couchbase/config/AbstractCouchbaseConfigurationTests.java @@ -20,6 +20,7 @@ import com.couchbase.client.CouchbaseClient; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.data.couchbase.TestApplicationConfig; import org.springframework.data.couchbase.core.mapping.Document; @@ -47,14 +48,13 @@ public class AbstractCouchbaseConfigurationTests { @Test public void usesConfigClassPackageAsBaseMappingPackage() throws Exception { AbstractCouchbaseConfiguration config = new SampleCouchbaseConfiguration(); - - assertEquals(config.getMappingBasePackage(), - SampleCouchbaseConfiguration.class.getPackage().getName()); + assertEquals(config.getMappingBasePackage(), SampleCouchbaseConfiguration.class.getPackage().getName()); assertEquals(config.getInitialEntitySet().size(), 1); assertTrue(config.getInitialEntitySet().contains(Entity.class)); } class SampleCouchbaseConfiguration extends AbstractCouchbaseConfiguration { + @Bean @Override public CouchbaseClient couchbaseClient() throws Exception { @@ -64,5 +64,6 @@ public class AbstractCouchbaseConfigurationTests { @Document static class Entity { + } } diff --git a/src/test/java/org/springframework/data/couchbase/config/CouchbaseTemplateParserIntegrationTests.java b/src/test/java/org/springframework/data/couchbase/config/CouchbaseTemplateParserIntegrationTests.java index 0b15e199..f17e0536 100644 --- a/src/test/java/org/springframework/data/couchbase/config/CouchbaseTemplateParserIntegrationTests.java +++ b/src/test/java/org/springframework/data/couchbase/config/CouchbaseTemplateParserIntegrationTests.java @@ -50,4 +50,14 @@ public class CouchbaseTemplateParserIntegrationTests { factory.getBean("couchbaseTemplate"); } + @Test + public void readsCouchbaseTemplateWithTranslationServiceAttributesCorrectly() { + reader.loadBeanDefinitions(new ClassPathResource("namespace/couchbase-template-with-translation-service-bean.xml")); + + BeanDefinition definition = factory.getBeanDefinition("couchbaseTemplate"); + assertEquals(2, definition.getConstructorArgumentValues().getArgumentCount()); + + factory.getBean("couchbaseTemplate"); + } + } diff --git a/src/test/resources/namespace/couchbase-bean.xml b/src/test/resources/namespace/couchbase-bean.xml index 134736a4..57b406c0 100644 --- a/src/test/resources/namespace/couchbase-bean.xml +++ b/src/test/resources/namespace/couchbase-bean.xml @@ -7,6 +7,10 @@ - + + + + + \ No newline at end of file diff --git a/src/test/resources/namespace/couchbase-template-with-translation-service-bean.xml b/src/test/resources/namespace/couchbase-template-with-translation-service-bean.xml new file mode 100644 index 00000000..77402784 --- /dev/null +++ b/src/test/resources/namespace/couchbase-template-with-translation-service-bean.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file