From 5bbc6b066c66d1ee23ffb21c22bc0958f7bb089e Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Mon, 9 Dec 2019 09:36:48 +0100 Subject: [PATCH] #250 - Throw IllegalArgumentException in StatementMapper if UPDATE contains no assignments. We now properly throw an IllegalArgumentException. Previously, the update object was attempted to being mapped and this failed as the update object was null. --- .../r2dbc/core/DefaultStatementMapper.java | 8 +++---- .../core/DefaultDatabaseClientUnitTests.java | 21 +++++++++++++++++++ 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java b/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java index 39c91c7..1d10c7b 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java +++ b/src/main/java/org/springframework/data/r2dbc/core/DefaultStatementMapper.java @@ -192,15 +192,15 @@ class DefaultStatementMapper implements StatementMapper { BindMarkers bindMarkers = this.dialect.getBindMarkersFactory().create(); Table table = Table.create(updateSpec.getTable()); + if (updateSpec.getUpdate() == null || updateSpec.getUpdate().getAssignments().isEmpty()) { + throw new IllegalArgumentException("UPDATE contains no assignments"); + } + BoundAssignments boundAssignments = this.updateMapper.getMappedObject(bindMarkers, updateSpec.getUpdate().getAssignments(), table, entity); Bindings bindings; - if (boundAssignments.getAssignments().isEmpty()) { - throw new IllegalStateException("UPDATE contains no assignments"); - } - bindings = boundAssignments.getBindings(); UpdateBuilder.UpdateWhere updateBuilder = StatementBuilder.update(table).set(boundAssignments.getAssignments()); diff --git a/src/test/java/org/springframework/data/r2dbc/core/DefaultDatabaseClientUnitTests.java b/src/test/java/org/springframework/data/r2dbc/core/DefaultDatabaseClientUnitTests.java index efd05b6..9281ab3 100644 --- a/src/test/java/org/springframework/data/r2dbc/core/DefaultDatabaseClientUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/core/DefaultDatabaseClientUnitTests.java @@ -15,6 +15,7 @@ */ package org.springframework.data.r2dbc.core; +import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import static org.springframework.data.r2dbc.query.Criteria.*; @@ -37,6 +38,7 @@ import org.mockito.junit.MockitoJUnitRunner; import org.reactivestreams.Publisher; import org.reactivestreams.Subscription; +import org.springframework.data.annotation.Id; import org.springframework.data.r2dbc.dialect.PostgresDialect; import org.springframework.data.r2dbc.mapping.SettableValue; import org.springframework.data.r2dbc.support.R2dbcExceptionTranslator; @@ -352,4 +354,23 @@ public class DefaultDatabaseClientUnitTests { .expectNextCount(1) // .verifyComplete(); } + + @Test // gh-250 + public void shouldThrowExceptionForSingleColumnObjectUpdate() { + + DefaultDatabaseClient databaseClient = (DefaultDatabaseClient) DatabaseClient.builder() + .connectionFactory(connectionFactory) // + .dataAccessStrategy(new DefaultReactiveDataAccessStrategy(PostgresDialect.INSTANCE)) // + .build(); + + assertThatIllegalArgumentException().isThrownBy(() -> databaseClient.update() // + .table(IdOnly.class) // + .using(new IdOnly()) // + .then()).withMessageContaining("UPDATE contains no assignments"); + } + + static class IdOnly { + + @Id String id; + } }