Fix empty collection conversion.

We now consider the target type for empty collections.

Closes #796
This commit is contained in:
Mark Paluch
2022-11-11 15:57:02 +01:00
parent fbe3bfb63e
commit ea000275e2
3 changed files with 47 additions and 5 deletions

View File

@@ -190,7 +190,6 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R
}
}
public Object readValue(@Nullable Object value, TypeInformation<?> type) {
if (null == value) {
@@ -553,6 +552,8 @@ public class MappingR2dbcConverter extends BasicRelationalConverter implements R
actualType = property.getActualType();
}
actualType = getTargetType(actualType);
Class<?> targetType = arrayColumns.getArrayType(actualType);
if (!property.isArray() || !targetType.isAssignableFrom(value.getClass())) {

View File

@@ -240,7 +240,6 @@ public class DefaultReactiveDataAccessStrategy implements ReactiveDataAccessStra
ArrayColumns arrayColumns = this.dialect.getArraySupport();
if (!arrayColumns.isSupported()) {
throw new InvalidDataAccessResourceUsageException(
"Dialect " + this.dialect.getClass().getName() + " does not support array columns");
}
@@ -266,8 +265,7 @@ public class DefaultReactiveDataAccessStrategy implements ReactiveDataAccessStra
return Parameter.empty(targetArrayType);
}
return Parameter.fromOrEmpty(this.converter.getArrayValue(arrayColumns, property, value.getValue()),
actualType);
return Parameter.fromOrEmpty(this.converter.getArrayValue(arrayColumns, property, value.getValue()), actualType);
}
/*

View File

@@ -17,8 +17,11 @@ package org.springframework.data.r2dbc.core;
import static org.springframework.data.r2dbc.testing.Assertions.*;
import io.r2dbc.postgresql.codec.Interval;
import lombok.RequiredArgsConstructor;
import java.time.Duration;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
@@ -28,6 +31,7 @@ import java.util.Set;
import org.junit.jupiter.api.Test;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import org.springframework.data.r2dbc.convert.EnumWriteSupport;
import org.springframework.data.r2dbc.dialect.PostgresDialect;
@@ -41,7 +45,8 @@ import org.springframework.data.relational.core.sql.SqlIdentifier;
*/
public class PostgresReactiveDataAccessStrategyTests extends ReactiveDataAccessStrategyTestSupport {
private final ReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(PostgresDialect.INSTANCE);
private final ReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(PostgresDialect.INSTANCE,
Arrays.asList(DurationToIntervalConverter.INSTANCE, IntervalToDurationConverter.INSTANCE));
@Override
protected ReactiveDataAccessStrategy getStrategy() {
@@ -116,6 +121,17 @@ public class PostgresReactiveDataAccessStrategyTests extends ReactiveDataAccessS
assertThat(outboundRow).containsColumn("my_objects").withColumn("my_objects").isEmpty().hasType(String.class);
}
@Test // gh-796
void shouldApplyCustomConversionForEmptyList() {
WithDuration withDuration = new WithDuration();
withDuration.durations = new ArrayList<>();
OutboundRow outboundRow = strategy.getOutboundRow(withDuration);
assertThat(outboundRow).containsColumn("durations").withColumn("durations").hasType(Interval[].class);
}
@Test // gh-252, gh-593
void shouldConvertCollectionOfEnumToString() {
@@ -202,6 +218,11 @@ public class PostgresReactiveDataAccessStrategyTests extends ReactiveDataAccessS
List<String> stringList;
}
static class WithDuration {
List<Duration> durations;
}
static class WithEnumCollections {
MyEnum[] enumArray;
@@ -242,5 +263,27 @@ public class PostgresReactiveDataAccessStrategyTests extends ReactiveDataAccessS
}
}
@WritingConverter
enum DurationToIntervalConverter implements Converter<Duration, Interval> {
INSTANCE;
@Override
public Interval convert(Duration duration) {
return Interval.of(duration);
}
}
@ReadingConverter
enum IntervalToDurationConverter implements Converter<Interval, Duration> {
INSTANCE;
@Override
public Duration convert(Interval interval) {
return interval.getDuration();
}
}
private static class MyEnumSupport extends EnumWriteSupport<MyEnum> {}
}