From bf19cb36a41626a742cee545f2820ae1d35390bb Mon Sep 17 00:00:00 2001 From: Louis Morgan Date: Wed, 22 Apr 2020 11:19:41 +0100 Subject: [PATCH] #354 - Allow saving an entity with a read-only collection-like property. Previously a NullPointerException would be thrown. Original pull request: #355. --- .../DefaultReactiveDataAccessStrategy.java | 2 +- ...ReactiveDataAccessStrategyTestSupport.java | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java b/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java index ed3628ec..fe393e6f 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DefaultReactiveDataAccessStrategy.java @@ -206,7 +206,7 @@ public class DefaultReactiveDataAccessStrategy implements ReactiveDataAccessStra for (RelationalPersistentProperty property : entity) { SettableValue value = row.get(property.getColumnName()); - if (shouldConvertArrayValue(property, value)) { + if (value != null && shouldConvertArrayValue(property, value)) { SettableValue writeValue = getArrayValue(value, property); row.put(property.getColumnName(), writeValue); diff --git a/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTestSupport.java b/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTestSupport.java index 9367448f..a86e3535 100644 --- a/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTestSupport.java +++ b/src/test/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategyTestSupport.java @@ -36,6 +36,7 @@ import java.util.function.Function; import org.junit.Test; +import org.springframework.data.annotation.ReadOnlyProperty; import org.springframework.data.r2dbc.dialect.R2dbcDialect; import org.springframework.data.r2dbc.mapping.SettableValue; import org.springframework.data.relational.core.sql.SqlIdentifier; @@ -177,6 +178,16 @@ public abstract class ReactiveDataAccessStrategyTestSupport { testType(PrimitiveTypes::setBinary, PrimitiveTypes::getBinary, "hello".getBytes(), "binary"); } + @Test // gh-354 + public void shouldNotWriteReadOnlyFields() { + TypeWithReadOnlyFields toSave = new TypeWithReadOnlyFields(); + toSave.setWritableField("writable"); + toSave.setReadOnlyField("readonly"); + toSave.setReadOnlyArrayField("readonly_array".getBytes()); + assertThat(getStrategy().getOutboundRow(toSave)) + .containsOnlyKeys(SqlIdentifier.unquoted("writable_field")); + } + private void testType(BiConsumer setter, Function getter, T testValue, String fieldname) { @@ -235,4 +246,13 @@ public abstract class ReactiveDataAccessStrategyTestSupport { UUID uuid; } + + @Data + static class TypeWithReadOnlyFields { + String writableField; + @ReadOnlyProperty + String readOnlyField; + @ReadOnlyProperty + byte[] readOnlyArrayField; + } }