Skip to content

Commit ae1bb6a

Browse files
committed
Fix empty collection conversion.
We now consider the target type for empty collections. Closes #1379
1 parent c7856d9 commit ae1bb6a

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/convert/MappingR2dbcConverter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -534,6 +534,8 @@ public Object getArrayValue(ArrayColumns arrayColumns, RelationalPersistentPrope
534534
actualType = property.getActualType();
535535
}
536536

537+
actualType = getTargetType(actualType);
538+
537539
Class<?> targetType = arrayColumns.getArrayType(actualType);
538540

539541
if (!property.isArray() || !targetType.isAssignableFrom(value.getClass())) {

spring-data-r2dbc/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,6 @@ private Parameter getArrayValue(Parameter value, RelationalPersistentProperty pr
214214
ArrayColumns arrayColumns = this.dialect.getArraySupport();
215215

216216
if (!arrayColumns.isSupported()) {
217-
218217
throw new InvalidDataAccessResourceUsageException(
219218
"Dialect " + this.dialect.getClass().getName() + " does not support array columns");
220219
}

spring-data-r2dbc/src/test/java/org/springframework/data/r2dbc/core/PostgresReactiveDataAccessStrategyTests.java

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,20 @@
1717

1818
import static org.springframework.data.r2dbc.testing.Assertions.*;
1919

20+
import io.r2dbc.postgresql.codec.Interval;
2021
import lombok.RequiredArgsConstructor;
2122

23+
import java.time.Duration;
24+
import java.util.ArrayList;
2225
import java.util.Arrays;
2326
import java.util.Collections;
2427
import java.util.EnumSet;
2528
import java.util.List;
2629
import java.util.Set;
2730

2831
import org.junit.jupiter.api.Test;
29-
3032
import org.springframework.core.convert.converter.Converter;
33+
import org.springframework.data.convert.ReadingConverter;
3134
import org.springframework.data.convert.WritingConverter;
3235
import org.springframework.data.r2dbc.convert.EnumWriteSupport;
3336
import org.springframework.data.r2dbc.dialect.PostgresDialect;
@@ -41,7 +44,8 @@
4144
*/
4245
public class PostgresReactiveDataAccessStrategyTests extends ReactiveDataAccessStrategyTestSupport {
4346

44-
private final ReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(PostgresDialect.INSTANCE);
47+
private final ReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(PostgresDialect.INSTANCE,
48+
Arrays.asList(DurationToIntervalConverter.INSTANCE, IntervalToDurationConverter.INSTANCE));
4549

4650
@Override
4751
protected ReactiveDataAccessStrategy getStrategy() {
@@ -116,6 +120,17 @@ void shouldApplyCustomConversionForNull() {
116120
assertThat(outboundRow).containsColumn("my_objects").withColumn("my_objects").isEmpty().hasType(String.class);
117121
}
118122

123+
@Test // gh-1379
124+
void shouldApplyCustomConversionForEmptyList() {
125+
126+
WithDuration withDuration = new WithDuration();
127+
withDuration.durations = new ArrayList<>();
128+
129+
OutboundRow outboundRow = strategy.getOutboundRow(withDuration);
130+
131+
assertThat(outboundRow).containsColumn("durations").withColumn("durations").hasType(Interval[].class);
132+
}
133+
119134
@Test // gh-252, gh-593
120135
void shouldConvertCollectionOfEnumToString() {
121136

@@ -202,6 +217,11 @@ static class WithArray {
202217
List<String> stringList;
203218
}
204219

220+
static class WithDuration {
221+
222+
List<Duration> durations;
223+
}
224+
205225
static class WithEnumCollections {
206226

207227
MyEnum[] enumArray;
@@ -242,5 +262,27 @@ public String convert(List<MyObject> myObjects) {
242262
}
243263
}
244264

265+
@WritingConverter
266+
enum DurationToIntervalConverter implements Converter<Duration, Interval> {
267+
268+
INSTANCE;
269+
270+
@Override
271+
public Interval convert(Duration duration) {
272+
return Interval.of(duration);
273+
}
274+
}
275+
276+
@ReadingConverter
277+
enum IntervalToDurationConverter implements Converter<Interval, Duration> {
278+
279+
INSTANCE;
280+
281+
@Override
282+
public Duration convert(Interval interval) {
283+
return interval.getDuration();
284+
}
285+
}
286+
245287
private static class MyEnumSupport extends EnumWriteSupport<MyEnum> {}
246288
}

0 commit comments

Comments
 (0)