From 72b78ec855429acc817ba718aa5cfc6af4689cde Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 13 Aug 2020 11:26:34 +0200 Subject: [PATCH] DATACASS-766 - Polishing. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use InstanceSupplier to configure the contactPoints property. Using BeanDefinitionBuilder.addPropertyValue(…) uses reflection for setting the property value and for value type discovers. The discovered property descriptor depends on the actual method order in which setters are discovered hence the actual type may change from String to Collection. Therefore we avoid using reflection for contactPoints. Original pull request: #178. --- .../cassandra/config/CqlSessionParser.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CqlSessionParser.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CqlSessionParser.java index 5102bb18a..c94737c8a 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CqlSessionParser.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/config/CqlSessionParser.java @@ -45,7 +45,7 @@ class CqlSessionParser extends AbstractSingleBeanDefinitionParser { */ @Override protected Class getBeanClass(Element element) { - return CqlSessionFactoryBean.class; + return ExtendedCqlSessionFactoryBean.class; } /* (non-Javadoc) @@ -67,8 +67,8 @@ class CqlSessionParser extends AbstractSingleBeanDefinitionParser { protected void doParse(Element element, ParserContext parserContext, BeanDefinitionBuilder builder) { addOptionalPropertyValue(builder, "keyspaceName", element, "keyspace-name"); + addOptionalPropertyValue(builder, "contactPointsAsString", element, "contact-points"); addOptionalPropertyValue(builder, "localDatacenter", element, "local-datacenter"); - addOptionalPropertyValue(builder, "contactPoints", element, "contact-points"); addOptionalPropertyValue(builder, "password", element, "password"); addOptionalPropertyValue(builder, "port", element, "port"); addOptionalPropertyValue(builder, "username", element, "username"); @@ -80,6 +80,8 @@ class CqlSessionParser extends AbstractSingleBeanDefinitionParser { addOptionalPropertyValue(builder, "schemaAction", element, "schema-action", SchemaAction.NONE.name()); parseChildElements(element, parserContext, builder); + + builder.getRawBeanDefinition().setSource(element); } /** @@ -157,4 +159,19 @@ class CqlSessionParser extends AbstractSingleBeanDefinitionParser { return element.getTextContent(); } + /** + * Wrapper to enable setting contact points as string to avoid over loaded setContactPoints reflection confusion that + * depends on the reflection method load order. + */ + static class ExtendedCqlSessionFactoryBean extends CqlSessionFactoryBean { + + /** + * Bridge method for {@link #setContactPoints(String)}. + * + * @param contactPoints + */ + public void setContactPointsAsString(String contactPoints) { + setContactPoints(contactPoints); + } + } }