Skip to content

Commit 0adeb1d

Browse files
committed
Merge pull request #8534 from eddumelendez:gh-8411
* pr/8534: Polish Polish "Add support for CustomConversions with Cassandra" Add support for CustomConversions with Cassandra
2 parents 7f7c606 + 2916cdf commit 0adeb1d

File tree

2 files changed

+78
-25
lines changed

2 files changed

+78
-25
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,6 +42,7 @@
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;
@@ -79,7 +81,8 @@ public CassandraDataAutoConfiguration(BeanFactory beanFactory,
7981

8082
@Bean
8183
@ConditionalOnMissingBean
82-
public CassandraMappingContext cassandraMapping() throws ClassNotFoundException {
84+
public CassandraMappingContext cassandraMapping(
85+
CassandraCustomConversions 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+
CassandraCustomConversions 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 CassandraCustomConversions 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: 62 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,14 @@
1616

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

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

2122
import com.datastax.driver.core.Session;
2223
import org.junit.After;
2324
import org.junit.Test;
2425

2526
import org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration;
26-
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
2727
import org.springframework.boot.autoconfigure.data.cassandra.city.City;
2828
import org.springframework.boot.autoconfigure.domain.EntityScan;
2929
import org.springframework.boot.test.util.TestPropertyValues;
@@ -32,19 +32,23 @@
3232
import org.springframework.context.annotation.ComponentScan;
3333
import org.springframework.context.annotation.Configuration;
3434
import org.springframework.context.annotation.FilterType;
35+
import org.springframework.core.convert.converter.Converter;
3536
import org.springframework.data.cassandra.core.CassandraTemplate;
37+
import org.springframework.data.cassandra.core.convert.CassandraCustomConversions;
3638
import org.springframework.data.cassandra.core.mapping.CassandraMappingContext;
3739
import org.springframework.data.cassandra.core.mapping.SimpleUserTypeResolver;
3840
import org.springframework.test.util.ReflectionTestUtils;
41+
import org.springframework.util.ObjectUtils;
3942

4043
import static org.assertj.core.api.Assertions.assertThat;
4144
import static org.mockito.Mockito.mock;
4245

4346
/**
44-
* Tests for {@link CassandraDataAutoConfiguration}
47+
* Tests for {@link CassandraDataAutoConfiguration}.
4548
*
4649
* @author Eddú Meléndez
4750
* @author Mark Paluch
51+
* @author Stephane Nicoll
4852
*/
4953
public class CassandraDataAutoConfigurationTests {
5054

@@ -59,26 +63,15 @@ public void close() {
5963

6064
@Test
6165
public void templateExists() {
62-
this.context = new AnnotationConfigApplicationContext();
63-
TestPropertyValues.of("spring.data.cassandra.keyspaceName:boot_test")
64-
.applyTo(this.context);
65-
this.context.register(TestExcludeConfiguration.class, TestConfiguration.class,
66-
PropertyPlaceholderAutoConfiguration.class,
67-
CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class);
68-
this.context.refresh();
66+
load(TestExcludeConfiguration.class);
6967
assertThat(this.context.getBeanNamesForType(CassandraTemplate.class).length)
7068
.isEqualTo(1);
7169
}
7270

7371
@Test
7472
@SuppressWarnings("unchecked")
7573
public void entityScanShouldSetInitialEntitySet() throws Exception {
76-
this.context = new AnnotationConfigApplicationContext();
77-
TestPropertyValues.of("spring.data.cassandra.keyspaceName:boot_test");
78-
this.context.register(TestConfiguration.class, EntityScanConfig.class,
79-
PropertyPlaceholderAutoConfiguration.class,
80-
CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class);
81-
this.context.refresh();
74+
load(EntityScanConfig.class);
8275
CassandraMappingContext mappingContext = this.context
8376
.getBean(CassandraMappingContext.class);
8477
Set<Class<?>> initialEntitySet = (Set<Class<?>>) ReflectionTestUtils
@@ -88,19 +81,43 @@ public void entityScanShouldSetInitialEntitySet() throws Exception {
8881

8982
@Test
9083
public void userTypeResolverShouldBeSet() throws Exception {
91-
this.context = new AnnotationConfigApplicationContext();
92-
TestPropertyValues.of("spring.data.cassandra.keyspaceName:boot_test")
93-
.applyTo(this.context);
94-
this.context.register(TestConfiguration.class,
95-
PropertyPlaceholderAutoConfiguration.class,
96-
CassandraAutoConfiguration.class, CassandraDataAutoConfiguration.class);
97-
this.context.refresh();
84+
load();
9885
CassandraMappingContext mappingContext = this.context
9986
.getBean(CassandraMappingContext.class);
10087
assertThat(ReflectionTestUtils.getField(mappingContext, "userTypeResolver"))
10188
.isInstanceOf(SimpleUserTypeResolver.class);
10289
}
10390

91+
@Test
92+
public void defaultConversions() {
93+
load();
94+
CassandraTemplate template = this.context.getBean(CassandraTemplate.class);
95+
assertThat(template.getConverter().getConversionService().canConvert(Person.class,
96+
String.class)).isFalse();
97+
}
98+
99+
@Test
100+
public void customConversions() {
101+
load(CustomConversionConfig.class);
102+
CassandraTemplate template = this.context.getBean(CassandraTemplate.class);
103+
assertThat(template.getConverter().getConversionService().canConvert(Person.class,
104+
String.class)).isTrue();
105+
106+
}
107+
108+
public void load(Class<?>... config) {
109+
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
110+
TestPropertyValues.of("spring.data.cassandra.keyspaceName:boot_test")
111+
.applyTo(ctx);
112+
if (!ObjectUtils.isEmpty(config)) {
113+
ctx.register(config);
114+
}
115+
ctx.register(TestConfiguration.class, CassandraAutoConfiguration.class,
116+
CassandraDataAutoConfiguration.class);
117+
ctx.refresh();
118+
this.context = ctx;
119+
}
120+
104121
@Configuration
105122
@ComponentScan(excludeFilters = @ComponentScan.Filter(classes = {
106123
Session.class }, type = FilterType.ASSIGNABLE_TYPE))
@@ -124,4 +141,27 @@ static class EntityScanConfig {
124141

125142
}
126143

144+
@Configuration
145+
static class CustomConversionConfig {
146+
147+
@Bean
148+
public CassandraCustomConversions myCassandraCustomConversions() {
149+
return new CassandraCustomConversions(Collections.singletonList(
150+
new MyConverter()));
151+
}
152+
153+
}
154+
155+
private static class MyConverter implements Converter<Person, String> {
156+
157+
@Override
158+
public String convert(Person o) {
159+
return null;
160+
}
161+
}
162+
163+
private static class Person {
164+
165+
}
166+
127167
}

0 commit comments

Comments
 (0)