Skip to content

Commit 744a1ed

Browse files
eddumelendezsnicoll
authored andcommitted
Add support for CustomConversions with Cassandra
This commit add the support for CustomConversions in spring-data-cassandra. To customize, bean just need to be declared and it will be auto-configured. See gh-8534
1 parent 7f7c606 commit 744a1ed

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfiguration.java

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.autoconfigure.data.cassandra;
1818

19+
import java.util.Collections;
1920
import java.util.List;
2021

2122
import com.datastax.driver.core.Cluster;
@@ -41,9 +42,11 @@
4142
import org.springframework.data.cassandra.core.CassandraAdminOperations;
4243
import org.springframework.data.cassandra.core.CassandraTemplate;
4344
import org.springframework.data.cassandra.core.convert.CassandraConverter;
45+
import org.springframework.data.cassandra.core.convert.CassandraCustomConversions;
4446
import org.springframework.data.cassandra.core.convert.MappingCassandraConverter;
4547
import org.springframework.data.cassandra.core.mapping.CassandraMappingContext;
4648
import org.springframework.data.cassandra.core.mapping.SimpleUserTypeResolver;
49+
import org.springframework.data.convert.CustomConversions;
4750
import org.springframework.util.StringUtils;
4851

4952
/**
@@ -79,7 +82,7 @@ public CassandraDataAutoConfiguration(BeanFactory beanFactory,
7982

8083
@Bean
8184
@ConditionalOnMissingBean
82-
public CassandraMappingContext cassandraMapping() throws ClassNotFoundException {
85+
public CassandraMappingContext cassandraMapping(CustomConversions conversions) throws ClassNotFoundException {
8386
CassandraMappingContext context = new CassandraMappingContext();
8487
List<String> packages = EntityScanPackages.get(this.beanFactory)
8588
.getPackageNames();
@@ -93,13 +96,17 @@ public CassandraMappingContext cassandraMapping() throws ClassNotFoundException
9396
context.setUserTypeResolver(new SimpleUserTypeResolver(this.cluster,
9497
this.properties.getKeyspaceName()));
9598
}
99+
context.setCustomConversions(conversions);
96100
return context;
97101
}
98102

99103
@Bean
100104
@ConditionalOnMissingBean
101-
public CassandraConverter cassandraConverter(CassandraMappingContext mapping) {
102-
return new MappingCassandraConverter(mapping);
105+
public CassandraConverter cassandraConverter(CassandraMappingContext mapping,
106+
CustomConversions conversions) {
107+
MappingCassandraConverter converter = new MappingCassandraConverter(mapping);
108+
converter.setCustomConversions(conversions);
109+
return converter;
103110
}
104111

105112
@Bean
@@ -123,4 +130,10 @@ public CassandraTemplate cassandraTemplate(Session session,
123130
return new CassandraTemplate(session, converter);
124131
}
125132

133+
@Bean
134+
@ConditionalOnMissingBean
135+
public CustomConversions cassandraCustomConversions() {
136+
return new CassandraCustomConversions(Collections.emptyList());
137+
}
138+
126139
}

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/cassandra/CassandraDataAutoConfigurationTests.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.autoconfigure.data.cassandra;
1818

19+
import java.util.Arrays;
1920
import java.util.Set;
2021

2122
import com.datastax.driver.core.Session;
@@ -26,13 +27,16 @@
2627
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
2728
import org.springframework.boot.autoconfigure.data.cassandra.city.City;
2829
import org.springframework.boot.autoconfigure.domain.EntityScan;
30+
import org.springframework.boot.test.util.EnvironmentTestUtils;
2931
import org.springframework.boot.test.util.TestPropertyValues;
3032
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
3133
import org.springframework.context.annotation.Bean;
3234
import org.springframework.context.annotation.ComponentScan;
3335
import org.springframework.context.annotation.Configuration;
3436
import org.springframework.context.annotation.FilterType;
37+
import org.springframework.core.convert.converter.Converter;
3538
import org.springframework.data.cassandra.core.CassandraTemplate;
39+
import org.springframework.data.cassandra.core.convert.CassandraCustomConversions;
3640
import org.springframework.data.cassandra.core.mapping.CassandraMappingContext;
3741
import org.springframework.data.cassandra.core.mapping.SimpleUserTypeResolver;
3842
import org.springframework.test.util.ReflectionTestUtils;
@@ -101,6 +105,22 @@ public void userTypeResolverShouldBeSet() throws Exception {
101105
.isInstanceOf(SimpleUserTypeResolver.class);
102106
}
103107

108+
@Test
109+
public void customConversions() {
110+
this.context = new AnnotationConfigApplicationContext();
111+
EnvironmentTestUtils.addEnvironment(this.context,
112+
"spring.data.cassandra.keyspaceName:boot_test");
113+
this.context.register(CustomConversionConfig.class,
114+
TestConfiguration.class,
115+
PropertyPlaceholderAutoConfiguration.class,
116+
CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class);
117+
this.context.refresh();
118+
CassandraTemplate template = this.context.getBean(CassandraTemplate.class);
119+
assertThat(template.getConverter().getConversionService().canConvert(Person.class,
120+
String.class)).isTrue();
121+
122+
}
123+
104124
@Configuration
105125
@ComponentScan(excludeFilters = @ComponentScan.Filter(classes = {
106126
Session.class }, type = FilterType.ASSIGNABLE_TYPE))
@@ -124,4 +144,26 @@ static class EntityScanConfig {
124144

125145
}
126146

147+
@Configuration
148+
static class CustomConversionConfig {
149+
150+
@Bean
151+
public CassandraCustomConversions cassandraCustomConversions() {
152+
return new CassandraCustomConversions(Arrays.asList(new MyConverter()));
153+
}
154+
155+
}
156+
157+
private static class MyConverter implements Converter<Person, String> {
158+
159+
@Override
160+
public String convert(Person o) {
161+
return null;
162+
}
163+
}
164+
165+
private static class Person {
166+
167+
}
168+
127169
}

0 commit comments

Comments
 (0)