diff --git a/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java b/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java index 4ebfcb5af..57c1e3c93 100644 --- a/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java +++ b/src/main/java/org/springframework/data/r2dbc/config/AbstractR2dbcConfiguration.java @@ -118,7 +118,7 @@ public abstract class AbstractR2dbcConfiguration { } /** - * Creates a {@link ReactiveDataAccessStrategy} using the configured {@link #r2dbcMappingContext(Optional) + * Creates a {@link ReactiveDataAccessStrategy} using the configured {@link #r2dbcMappingContext(Optional, R2dbcCustomConversions)} * RelationalMappingContext}. * * @param mappingContext the configured {@link RelationalMappingContext}. diff --git a/src/main/java/org/springframework/data/r2dbc/function/DefaultReactiveDataAccessStrategy.java b/src/main/java/org/springframework/data/r2dbc/function/DefaultReactiveDataAccessStrategy.java index 5d865e774..abe26fc37 100644 --- a/src/main/java/org/springframework/data/r2dbc/function/DefaultReactiveDataAccessStrategy.java +++ b/src/main/java/org/springframework/data/r2dbc/function/DefaultReactiveDataAccessStrategy.java @@ -261,11 +261,13 @@ public class DefaultReactiveDataAccessStrategy implements ReactiveDataAccessStra } if (!dialect.supportsArrayColumns()) { + throw new InvalidDataAccessResourceUsageException( "Dialect " + dialect.getClass().getName() + " does not support array columns"); } if (!property.isArray()) { + Object zeroLengthArray = Array.newInstance(property.getActualType(), 0); return relationalConverter.getConversionService().convert(value, zeroLengthArray.getClass()); } diff --git a/src/test/java/org/springframework/data/r2dbc/dialect/PostgresDialectUnitTests.java b/src/test/java/org/springframework/data/r2dbc/dialect/PostgresDialectUnitTests.java index 29f5d2cae..7df2e22f6 100644 --- a/src/test/java/org/springframework/data/r2dbc/dialect/PostgresDialectUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/dialect/PostgresDialectUnitTests.java @@ -42,5 +42,21 @@ public class PostgresDialectUnitTests { SimpleTypeHolder holder = PostgresDialect.INSTANCE.getSimpleTypeHolder(); assertThat(holder.isSimpleType(String[].class)).isTrue(); + + @Test // gh-30 + public void shouldConsiderIntArrayTypeAsSimple() { + + SimpleTypeHolder holder = PostgresDialect.INSTANCE.getSimpleTypeHolder(); + + assertThat(holder.isSimpleType(int[].class)).isTrue(); + } + + @Test // gh-30 + public void shouldConsiderIntegerArrayTypeAsSimple() { + + SimpleTypeHolder holder = PostgresDialect.INSTANCE.getSimpleTypeHolder(); + + assertThat(holder.isSimpleType(Integer[].class)).isTrue(); + } } } diff --git a/src/test/java/org/springframework/data/r2dbc/function/DefaultReactiveDataAccessStrategyUnitTests.java b/src/test/java/org/springframework/data/r2dbc/function/DefaultReactiveDataAccessStrategyUnitTests.java index a8e7a5d38..120d6d4ea 100644 --- a/src/test/java/org/springframework/data/r2dbc/function/DefaultReactiveDataAccessStrategyUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/function/DefaultReactiveDataAccessStrategyUnitTests.java @@ -112,6 +112,7 @@ public class DefaultReactiveDataAccessStrategyUnitTests { .getColumnsToUpdate(new WithCollectionTypes(new String[] { "one", "two" }, null)); Object stringArray = columnsToUpdate.get("string_array").getValue(); + assertThat(stringArray).isInstanceOf(String[].class); assertThat((String[]) stringArray).hasSize(2).contains("one", "two"); } @@ -123,6 +124,7 @@ public class DefaultReactiveDataAccessStrategyUnitTests { .getColumnsToUpdate(new WithCollectionTypes(null, Arrays.asList("one", "two"))); Object stringArray = columnsToUpdate.get("string_collection").getValue(); + assertThat(stringArray).isInstanceOf(String[].class); assertThat((String[]) stringArray).hasSize(2).contains("one", "two"); } @@ -134,6 +136,7 @@ public class DefaultReactiveDataAccessStrategyUnitTests { List stringCollection; WithCollectionTypes(String[] stringArray, List stringCollection) { + this.stringArray = stringArray; this.stringCollection = stringCollection; } diff --git a/src/test/java/org/springframework/data/r2dbc/function/convert/EntityRowMapperUnitTests.java b/src/test/java/org/springframework/data/r2dbc/function/convert/EntityRowMapperUnitTests.java index b17c080d8..d7023acea 100644 --- a/src/test/java/org/springframework/data/r2dbc/function/convert/EntityRowMapperUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/function/convert/EntityRowMapperUnitTests.java @@ -69,6 +69,35 @@ public class EntityRowMapperUnitTests { assertThat(result.ids).contains("foo", "bar"); } + @Test // gh-30 + public void shouldConvertArrayToSet() { + + EntityRowMapper mapper = getRowMapper(EntityWithCollection.class); + when(rowMock.get("integerSet")).thenReturn((new int[] { 3, 14 })); + + EntityWithCollection result = mapper.apply(rowMock, metadata); + assertThat(result.integerSet).contains(3, 14); + } + + @Test // gh-30 + public void shouldConvertArrayMembers() { + + EntityRowMapper mapper = getRowMapper(EntityWithCollection.class); + when(rowMock.get("primitiveIntegers")).thenReturn((new long[] { 3L, 14L })); + + EntityWithCollection result = mapper.apply(rowMock, metadata); + assertThat(result.primitiveIntegers).contains(3, 14); + } + + @Test // gh-30 + public void shouldConvertArrayToBoxedArray() { + + EntityRowMapper mapper = getRowMapper(EntityWithCollection.class); + when(rowMock.get("boxedIntegers")).thenReturn((new int[] { 3, 11 })); + + EntityWithCollection result = mapper.apply(rowMock, metadata); + assertThat(result.boxedIntegers).contains(3, 11); + } @SuppressWarnings("unchecked") private EntityRowMapper getRowMapper(Class type) { RelationalPersistentEntity entity = (RelationalPersistentEntity) strategy.getMappingContext() @@ -92,5 +121,8 @@ public class EntityRowMapperUnitTests { static class EntityWithCollection { List ids; + Set integerSet; + Integer[] boxedIntegers; + int[] primitiveIntegers; } }