DATACASS-401 - Fix bean name for CassandraTemplate instances using XML namespace configuration.

We now use the correct bean name `cassandraTemplate` when configuring a CassandraTemplate instance via XML namespace support. Previously, the bean name defaulted to `cqlTemplate`. CassandraTemplate and CqlTemplate no longer share the same type hierarchy but are separated since 2.0.x.

Original pull request: #96.
Related ticket: DATACASS-292.
This commit is contained in:
Mateusz Szymczak
2017-02-13 17:02:41 +01:00
committed by Mark Paluch
parent 77971cf281
commit 52b7f0f58d
5 changed files with 14 additions and 23 deletions

View File

@@ -181,7 +181,7 @@ public class CassandraMappingBeanFactoryPostProcessor implements BeanFactoryPost
.addConstructorArgReference(converterBeanName) //
.getBeanDefinition();
BeanDefinitionHolder template = new BeanDefinitionHolder(beanDefinition, DefaultBeanNames.TEMPLATE);
BeanDefinitionHolder template = new BeanDefinitionHolder(beanDefinition, DefaultBeanNames.DATA_TEMPLATE);
registry.registerBeanDefinition(template.getBeanName(), template.getBeanDefinition());
return template;

View File

@@ -15,11 +15,13 @@
*/
package org.springframework.data.cassandra.config.xml;
import static org.springframework.cassandra.config.xml.ParsingUtils.addOptionalPropertyReference;
import org.springframework.beans.factory.BeanDefinitionStoreException;
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.cassandra.config.xml.CassandraCqlTemplateParser;
import org.springframework.data.cassandra.config.CassandraTemplateFactoryBean;
import org.springframework.data.cassandra.config.DefaultBeanNames;
import org.springframework.util.StringUtils;
@@ -31,7 +33,7 @@ import org.w3c.dom.Element;
* @author Matthew T. Adams
* @author Mark Paluch
*/
public class CassandraTemplateParser extends CassandraCqlTemplateParser {
public class CassandraTemplateParser extends AbstractSingleBeanDefinitionParser {
/* (non-Javadoc)
* @see org.springframework.cassandra.config.xml.CassandraCqlTemplateParser#getBeanClass(org.w3c.dom.Element)
@@ -48,9 +50,6 @@ public class CassandraTemplateParser extends CassandraCqlTemplateParser {
protected String resolveId(Element element, AbstractBeanDefinition definition, ParserContext parserContext)
throws BeanDefinitionStoreException {
// TODO: super.resolveId resolves always to a non-empty id because its fallback is DefaultCqlBeanNames.TEMPLATE.
// This also means that CassandraTemplate is exposed as bean named cqlTemplate. This should change with 2.0
// because 2.0 breaks up inheritance.
String id = super.resolveId(element, definition, parserContext);
return StringUtils.hasText(id) ? id : DefaultBeanNames.DATA_TEMPLATE;
}
@@ -65,14 +64,7 @@ public class CassandraTemplateParser extends CassandraCqlTemplateParser {
super.doParse(element, parserContext, builder);
parseConverterAttribute(element, parserContext, builder);
}
protected void parseConverterAttribute(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) {
String converterRef = element.getAttribute("cassandra-converter-ref");
if (!StringUtils.hasText(converterRef)) {
converterRef = DefaultBeanNames.CONVERTER;
}
builder.addPropertyReference("converter", converterRef);
addOptionalPropertyReference(builder, "converter", element, "cassandra-converter-ref", DefaultBeanNames.CONVERTER);
addOptionalPropertyReference(builder, "session", element, "session-ref", DefaultBeanNames.SESSION);
}
}

View File

@@ -20,7 +20,6 @@ import java.util.Collection;
import java.util.Collections;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.cassandra.config.xml.DefaultCqlBeanNames;
import org.springframework.cassandra.config.xml.ParsingUtils;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.data.cassandra.config.DefaultBeanNames;
@@ -78,9 +77,8 @@ public class CassandraRepositoryConfigurationExtension extends RepositoryConfigu
Element element = config.getElement();
// TODO: XML-based configuration uses a different bean name than Java config
ParsingUtils.addOptionalPropertyReference(builder, "cassandraTemplate", element, CASSANDRA_TEMPLATE_REF,
DefaultCqlBeanNames.TEMPLATE);
DefaultBeanNames.DATA_TEMPLATE);
}
/* (non-Javadoc)

View File

@@ -25,6 +25,7 @@ import java.lang.annotation.Target;
import org.springframework.beans.factory.FactoryBean;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Import;
import org.springframework.data.cassandra.config.DefaultBeanNames;
import org.springframework.data.cassandra.core.CassandraTemplate;
import org.springframework.data.cassandra.repository.support.CassandraRepositoryFactoryBean;
import org.springframework.data.repository.config.DefaultRepositoryBaseClass;
@@ -120,7 +121,7 @@ public @interface EnableCassandraRepositories {
/**
* Configures the name of the {@link CassandraTemplate} bean to be used with the repositories detected.
*
* Defaults to {@link DefaultBeanNames#DATA_TEMPLATE}
* @return
*/
String cassandraTemplateRef() default "cassandraTemplate";

View File

@@ -47,9 +47,9 @@ public class CassandraMappingBeanFactoryPostProcessorUnitTests {
context.load(CassandraMappingBeanFactoryPostProcessorUnitTests.class, "cluster-and-mock-session.xml");
context.refresh();
assertThat(context.getBeanNamesForType(CassandraOperations.class), hasItemInArray("cqlTemplate"));
assertThat(context.getBeanNamesForType(CassandraMappingContext.class), hasItemInArray("cassandraMapping"));
assertThat(context.getBeanNamesForType(CassandraConverter.class), hasItemInArray("cassandraConverter"));
assertThat(context.getBeanNamesForType(CassandraOperations.class), hasItemInArray(DefaultBeanNames.DATA_TEMPLATE));
assertThat(context.getBeanNamesForType(CassandraMappingContext.class), hasItemInArray(DefaultBeanNames.CONTEXT));
assertThat(context.getBeanNamesForType(CassandraConverter.class), hasItemInArray(DefaultBeanNames.CONVERTER));
}
@Test // DATACASS-290
@@ -59,7 +59,7 @@ public class CassandraMappingBeanFactoryPostProcessorUnitTests {
context.load(CassandraMappingBeanFactoryPostProcessorUnitTests.class, "mock-session-mapping-converter.xml");
context.refresh();
assertThat(context.getBeanNamesForType(CassandraOperations.class), hasItemInArray("cqlTemplate"));
assertThat(context.getBeanNamesForType(CassandraOperations.class), hasItemInArray(DefaultBeanNames.DATA_TEMPLATE));
}
@Test // DATACASS-290