diff --git a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java index 984b58776..9be89d92f 100644 --- a/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java +++ b/spring-data-cassandra/src/main/java/org/springframework/data/cassandra/core/convert/MappingCassandraConverter.java @@ -961,23 +961,6 @@ public class MappingCassandraConverter extends AbstractCassandraConverter @SuppressWarnings("unchecked") private Object convertReadValue(Object value, TypeInformation typeInformation) { - if (getCustomConversions().hasCustomWriteTarget(typeInformation.getRequiredActualType().getType()) - && typeInformation.isCollectionLike()) { - - if (value instanceof Collection) { - - Collection original = (Collection) value; - - Collection converted = CollectionFactory.createCollection(typeInformation.getType(), original.size()); - - for (Object element : original) { - converted.add(getConversionService().convert(element, typeInformation.getRequiredActualType().getType())); - } - - return converted; - } - } - if (typeInformation.isCollectionLike() && value instanceof Collection) { return readCollectionOrArrayInternal((Collection) value, typeInformation); } @@ -1034,16 +1017,14 @@ public class MappingCassandraConverter extends AbstractCassandraConverter BasicCassandraPersistentEntity entity = getMappingContext().getPersistentEntity(elementType); - if (entity != null) { + if (entity != null && entity.isUserDefinedType()) { + for (Object element : source) { + collection.add(readEntityFromUdt(entity, (UDTValue) element)); + } - if (entity.isUserDefinedType()) { - for (Object udtValue : source) { - collection.add(readEntityFromUdt(entity, (UDTValue) udtValue)); - } - } else if (entity.isTupleType()) { - for (Object tupleValue : source) { - collection.add(readEntityFromTuple(entity, (TupleValue) tupleValue)); - } + } else if (entity != null && entity.isTupleType()) { + for (Object element : source) { + collection.add(readEntityFromTuple(entity, (TupleValue) element)); } } else { for (Object element : source) { diff --git a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CustomConversionIntegrationTests.java b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CustomConversionIntegrationTests.java index e4fab14f9..6e58924ba 100755 --- a/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CustomConversionIntegrationTests.java +++ b/spring-data-cassandra/src/test/java/org/springframework/data/cassandra/core/convert/CustomConversionIntegrationTests.java @@ -27,6 +27,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Set; +import java.util.function.Consumer; import org.junit.Before; import org.junit.Test; @@ -57,19 +58,7 @@ public class CustomConversionIntegrationTests extends AbstractKeyspaceCreatingIn @Before public void setUp() { - List> converters = new ArrayList<>(); - converters.add(new PersonReadConverter()); - converters.add(new PersonWriteConverter()); - CustomConversions customConversions = new CassandraCustomConversions(converters); - - CassandraMappingContext mappingContext = new CassandraMappingContext(); - mappingContext.setCustomConversions(customConversions); - mappingContext.afterPropertiesSet(); - - MappingCassandraConverter converter = new MappingCassandraConverter(mappingContext); - converter.setCustomConversions(customConversions); - converter.afterPropertiesSet(); - + MappingCassandraConverter converter = createConverter(); cassandraOperations = new CassandraTemplate(session, converter); SchemaTestUtils.potentiallyCreateTableFor(Employee.class, cassandraOperations); @@ -179,19 +168,55 @@ public class CustomConversionIntegrationTests extends AbstractKeyspaceCreatingIn assertThat(employee.getPeople()).extracting(Person::getFirstname).contains("Apu"); } - @Test // DATACASS-296 - public void dummy() { + @Test // DATACASS-607 + public void shouldApplyCustomReadConverterIfOnlyReadIsCustomized() { - cassandraOperations.getCqlOperations().execute(QueryBuilder.insertInto("employee").value("id", "employee-id")); + MappingCassandraConverter converter = createConverter(converters -> { + converters.add(new PersonReadConverter()); + }); + + cassandraOperations = new CassandraTemplate(session, converter); + + cassandraOperations.getCqlOperations().execute(QueryBuilder.insertInto("employee").value("id", "employee-id") + .value("people", Collections.singleton("{\"firstname\":\"Apu\",\"lastname\":\"Nahasapeemapetilon\"}"))); + + Employee employee = cassandraOperations.selectOne(QueryBuilder.select("id", "people").from("employee"), + Employee.class); + + assertThat(employee.getId()).isEqualTo("employee-id"); + assertThat(employee.getPeople()).isNotNull().hasSize(1); + + assertThat(employee.getPeople()).extracting(Person::getFirstname).contains("Apu"); - cassandraOperations.getCqlOperations() - .execute(QueryBuilder.update("employee").where(QueryBuilder.eq("id", "employee-id")).with(QueryBuilder - .set("people", Collections.singleton("{\"firstname\":\"Apu\",\"lastname\":\"Nahasapeemapetilon\"}")))); } - /** - * @author Mark Paluch - */ + private static MappingCassandraConverter createConverter() { + + return createConverter(converters -> { + converters.add(new PersonReadConverter()); + converters.add(new PersonWriteConverter()); + + }); + } + + private static MappingCassandraConverter createConverter(Consumer>> converterCustomizer) { + + List> converters = new ArrayList<>(); + + converterCustomizer.accept(converters); + + CustomConversions customConversions = new CassandraCustomConversions(converters); + + CassandraMappingContext mappingContext = new CassandraMappingContext(); + mappingContext.setCustomConversions(customConversions); + mappingContext.afterPropertiesSet(); + + MappingCassandraConverter converter = new MappingCassandraConverter(mappingContext); + converter.setCustomConversions(customConversions); + converter.afterPropertiesSet(); + return converter; + } + @Data @Table static class Employee { @@ -203,9 +228,6 @@ public class CustomConversionIntegrationTests extends AbstractKeyspaceCreatingIn Set people; } - /** - * @author Mark Paluch - */ @Data @AllArgsConstructor @NoArgsConstructor