DATACASS-766 - Polishing.

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<InetSocketAddress>. Therefore we avoid using reflection for contactPoints.

Original pull request: #178.
This commit is contained in:
Mark Paluch
2020-08-13 11:26:34 +02:00
parent d573fb223c
commit 72b78ec855

View File

@@ -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);
}
}
}