From 3d59c63bc06c355008e1cec38d87544f1210c4fd Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Tue, 28 Jul 2020 11:52:50 +0200 Subject: [PATCH] #368 - Polishing. Original pull request: #412. --- src/main/asciidoc/reference/r2dbc-upgrading.adoc | 6 +++--- .../r2dbc/connectionfactory/ConnectionHandle.java | 2 +- .../connectionfactory/SmartConnectionFactory.java | 2 +- .../init/DatabasePopulatorUtils.java | 3 ++- .../r2dbc/core/ReactiveDataAccessStrategy.java | 3 ++- .../support/R2dbcRepositoryFactory.java | 4 +--- .../support/R2dbcRepositoryFactoryBean.java | 1 - .../data/r2dbc/core/DatabaseClientExtensions.kt | 15 +++++++++++++++ .../core/ReactiveUpdateOperationUnitTests.java | 5 +++-- .../config/R2dbcRepositoriesRegistrarTests.java | 11 ++++++----- 10 files changed, 34 insertions(+), 18 deletions(-) diff --git a/src/main/asciidoc/reference/r2dbc-upgrading.adoc b/src/main/asciidoc/reference/r2dbc-upgrading.adoc index 0d229165..0507840a 100644 --- a/src/main/asciidoc/reference/r2dbc-upgrading.adoc +++ b/src/main/asciidoc/reference/r2dbc-upgrading.adoc @@ -9,7 +9,7 @@ The following sections explain how to migrate to a newer version of Spring Data Spring Data R2DBC was developed with the intent to evaluate how well R2DBC can integrate with Spring applications. One of the main aspects was to move core support into Spring Framework once R2DBC support has proven useful. -Spring Framework 5.3 ships with a new module: Spring R2DBC. +Spring Framework 5.3 ships with a new module: Spring R2DBC (`spring-r2dbc`). `spring-r2dbc` ships core R2DBC functionality (a slim variant of `DatabaseClient`, Transaction Manager, Connection Factory initialization, Exception translation) that was initially provided by Spring Data R2DBC. The 1.2.0 release aligns with what's provided in Spring R2DBC by making several changes outlined in the following sections. @@ -37,13 +37,13 @@ Spring R2DBC provides a slim exception translation variant without an SPI for no === Usage of replacements provided by Spring R2DBC To ease migration, several deprecated types are now subtypes of their replacements provided by Spring R2DBC. Spring Data R2DBC has changes several methods or introduced new methods accepting Spring R2DBC types. -Specifically the following classes are affected: +Specifically the following classes are changed: * `R2dbcEntityTemplate` * `R2dbcDialect` * Types in `org.springframework.data.r2dbc.query` -We recommend that you review your imports if you work with these types directly. +We recommend that you review and update your imports if you work with these types directly. === Breaking Changes diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHandle.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHandle.java index 62d1177e..938d59ed 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHandle.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/ConnectionHandle.java @@ -23,7 +23,7 @@ import io.r2dbc.spi.Connection; * @author Mark Paluch * @see SimpleConnectionHandle * @see ConnectionHolder - * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. + * @deprecated since 1.2 in favor of Spring R2DBC without replacement. */ @FunctionalInterface @Deprecated diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/SmartConnectionFactory.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/SmartConnectionFactory.java index aa7f59bb..09f13362 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/SmartConnectionFactory.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/SmartConnectionFactory.java @@ -27,7 +27,7 @@ import io.r2dbc.spi.ConnectionFactory; * * @author Mark Paluch * @see ConnectionFactoryUtils#closeConnection - * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection} instead. + * @deprecated since 1.2 in favor of Spring R2DBC without replacement. */ @Deprecated public interface SmartConnectionFactory extends ConnectionFactory { diff --git a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulatorUtils.java b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulatorUtils.java index db6ad11d..6d6e61f6 100644 --- a/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulatorUtils.java +++ b/src/main/java/org/springframework/data/r2dbc/connectionfactory/init/DatabasePopulatorUtils.java @@ -27,7 +27,8 @@ import org.springframework.util.Assert; * Utility methods for executing a {@link DatabasePopulator}. * * @author Mark Paluch - * @deprecated since 1.2 in favor of Spring R2DBC. Use {@link org.springframework.r2dbc.connection.init} instead. + * @deprecated since 1.2 in favor of Spring R2DBC. Use + * {@link org.springframework.r2dbc.connection.init.DatabasePopulator#populate(ConnectionFactory)} instead. */ @Deprecated public abstract class DatabasePopulatorUtils { diff --git a/src/main/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategy.java b/src/main/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategy.java index 90215da6..b35cac98 100644 --- a/src/main/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategy.java +++ b/src/main/java/org/springframework/data/r2dbc/core/ReactiveDataAccessStrategy.java @@ -68,10 +68,11 @@ public interface ReactiveDataAccessStrategy { * @since 1.1 * @deprecated since 1.2, use {@link #getBindValue(Parameter)} instead. */ + @Deprecated SettableValue getBindValue(SettableValue value); /** - * Return a potentially converted {@link SettableValue} for strategies that support type conversion. + * Return a potentially converted {@link Parameter} for strategies that support type conversion. * * @param value must not be {@literal null}. * @return diff --git a/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactory.java b/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactory.java index 5fe55767..4c71dc8b 100644 --- a/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactory.java +++ b/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactory.java @@ -21,7 +21,6 @@ import java.util.Optional; import org.springframework.data.mapping.context.MappingContext; import org.springframework.data.projection.ProjectionFactory; import org.springframework.data.r2dbc.convert.R2dbcConverter; -import org.springframework.data.r2dbc.core.DatabaseClient; import org.springframework.data.r2dbc.core.R2dbcEntityOperations; import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.data.r2dbc.core.ReactiveDataAccessStrategy; @@ -185,8 +184,7 @@ public class R2dbcRepositoryFactory extends ReactiveRepositoryFactorySupport { return new StringBasedR2dbcQuery(queryMethod, this.databaseClient, this.converter, EXPRESSION_PARSER, this.evaluationContextProvider); } else { - return new PartTreeR2dbcQuery(queryMethod, this.databaseClient, this.converter, - this.dataAccessStrategy); + return new PartTreeR2dbcQuery(queryMethod, this.databaseClient, this.converter, this.dataAccessStrategy); } } } diff --git a/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBean.java b/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBean.java index 0102e406..b4042512 100644 --- a/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBean.java +++ b/src/main/java/org/springframework/data/r2dbc/repository/support/R2dbcRepositoryFactoryBean.java @@ -18,7 +18,6 @@ package org.springframework.data.r2dbc.repository.support; import java.io.Serializable; import org.springframework.data.mapping.context.MappingContext; -import org.springframework.data.r2dbc.core.DatabaseClient; import org.springframework.data.r2dbc.core.R2dbcEntityOperations; import org.springframework.data.r2dbc.core.ReactiveDataAccessStrategy; import org.springframework.data.repository.Repository; diff --git a/src/main/kotlin/org/springframework/data/r2dbc/core/DatabaseClientExtensions.kt b/src/main/kotlin/org/springframework/data/r2dbc/core/DatabaseClientExtensions.kt index e85d25a5..cecd89f6 100644 --- a/src/main/kotlin/org/springframework/data/r2dbc/core/DatabaseClientExtensions.kt +++ b/src/main/kotlin/org/springframework/data/r2dbc/core/DatabaseClientExtensions.kt @@ -23,6 +23,7 @@ import org.springframework.data.r2dbc.mapping.SettableValue * * @author Sebastien Deleuze */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") suspend fun DatabaseClient.GenericExecuteSpec.await() { then().awaitFirstOrNull() } @@ -34,6 +35,7 @@ suspend fun DatabaseClient.GenericExecuteSpec.await() { * @author Ibanga Enoobong Ime */ @Suppress("EXTENSION_SHADOWED_BY_MEMBER") +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.TypedExecuteSpec<*>.bind(index: Int, value: T?) = bind(index, SettableValue.fromOrEmpty(value, T::class.java)) /** @@ -43,6 +45,7 @@ inline fun DatabaseClient.TypedExecuteSpec<*>.bind(index: Int, * @author Ibanga Enoobong Ime */ @Suppress("EXTENSION_SHADOWED_BY_MEMBER") +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.GenericExecuteSpec.bind(index: Int, value: T?) = bind(index, SettableValue.fromOrEmpty(value, T::class.java)) /** @@ -52,6 +55,7 @@ inline fun DatabaseClient.GenericExecuteSpec.bind(index: Int, * @author Ibanga Enoobong Ime */ @Suppress("EXTENSION_SHADOWED_BY_MEMBER") +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.TypedExecuteSpec<*>.bind(name: String, value: T?) = bind(name, SettableValue.fromOrEmpty(value, T::class.java)) /** @@ -61,6 +65,7 @@ inline fun DatabaseClient.TypedExecuteSpec<*>.bind(name: Strin * @author Ibanga Enoobong Ime */ @Suppress("EXTENSION_SHADOWED_BY_MEMBER") +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.GenericExecuteSpec.bind(name: String, value: T?) = bind(name, SettableValue.fromOrEmpty(value, T::class.java)) /** @@ -69,6 +74,7 @@ inline fun DatabaseClient.GenericExecuteSpec.bind(name: String * * @author Sebastien Deleuze */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.GenericExecuteSpec.asType(): DatabaseClient.TypedExecuteSpec = `as`(T::class.java) @@ -78,6 +84,7 @@ inline fun DatabaseClient.GenericExecuteSpec.asType(): Databas * * @author Sebastien Deleuze */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.GenericSelectSpec.asType(): DatabaseClient.TypedSelectSpec = `as`(T::class.java) @@ -86,6 +93,7 @@ inline fun DatabaseClient.GenericSelectSpec.asType(): Database * * @author Sebastien Deleuze */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") suspend fun DatabaseClient.TypedExecuteSpec.await() { then().awaitFirstOrNull() } @@ -96,6 +104,7 @@ suspend fun DatabaseClient.TypedExecuteSpec.await() { * * @author Sebastien Deleuze */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.TypedExecuteSpec.asType(): DatabaseClient.TypedExecuteSpec = `as`(T::class.java) @@ -104,6 +113,7 @@ inline fun DatabaseClient.TypedExecuteSpec.asType(): Databa * * @author Sebastien Deleuze */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") suspend fun DatabaseClient.InsertSpec.await() { then().awaitFirstOrNull() } @@ -114,6 +124,7 @@ suspend fun DatabaseClient.InsertSpec.await() { * * @author Sebastien Deleuze */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.InsertIntoSpec.into(): DatabaseClient.TypedInsertSpec = into(T::class.java) @@ -123,6 +134,7 @@ inline fun DatabaseClient.InsertIntoSpec.into(): DatabaseClien * @author Mark Paluch */ @Suppress("EXTENSION_SHADOWED_BY_MEMBER") +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.GenericInsertSpec<*>.value(name: String, value: T?) = value(name, SettableValue.fromOrEmpty(value, T::class.java)) @@ -132,6 +144,7 @@ inline fun DatabaseClient.GenericInsertSpec<*>.value(name: Str * * @author Jonas Bark */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.SelectFromSpec.from(): DatabaseClient.TypedSelectSpec = from(T::class.java) @@ -141,6 +154,7 @@ inline fun DatabaseClient.SelectFromSpec.from(): DatabaseClien * * @author Mark Paluch */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.UpdateTableSpec.table(): DatabaseClient.TypedUpdateSpec = table(T::class.java) @@ -150,5 +164,6 @@ inline fun DatabaseClient.UpdateTableSpec.table(): DatabaseCli * * @author Jonas Bark */ +@Deprecated("Deprecated in favor of Spring R2DBC's DatabaseClient") inline fun DatabaseClient.DeleteFromSpec.from(): DatabaseClient.TypedDeleteSpec = from(T::class.java) diff --git a/src/test/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperationUnitTests.java b/src/test/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperationUnitTests.java index 02d18e11..b35af0dc 100644 --- a/src/test/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperationUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/core/ReactiveUpdateOperationUnitTests.java @@ -27,6 +27,7 @@ import org.junit.Test; 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.testing.StatementRecorder; import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.query.Update; @@ -68,7 +69,7 @@ public class ReactiveUpdateOperationUnitTests { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); assertThat(statement.getSql()).isEqualTo("UPDATE person SET THE_NAME = $1"); - assertThat(statement.getBindings()).hasSize(1).containsEntry(0, SettableValue.from("Heisenberg")); + assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Heisenberg")); } @Test // gh-410 @@ -87,7 +88,7 @@ public class ReactiveUpdateOperationUnitTests { StatementRecorder.RecordedStatement statement = recorder.getCreatedStatement(s -> s.startsWith("UPDATE")); assertThat(statement.getSql()).isEqualTo("UPDATE table SET THE_NAME = $1"); - assertThat(statement.getBindings()).hasSize(1).containsEntry(0, SettableValue.from("Heisenberg")); + assertThat(statement.getBindings()).hasSize(1).containsEntry(0, Parameter.from("Heisenberg")); } @Test // gh-220 diff --git a/src/test/java/org/springframework/data/r2dbc/repository/config/R2dbcRepositoriesRegistrarTests.java b/src/test/java/org/springframework/data/r2dbc/repository/config/R2dbcRepositoriesRegistrarTests.java index 470e7da2..82ef0bd4 100644 --- a/src/test/java/org/springframework/data/r2dbc/repository/config/R2dbcRepositoriesRegistrarTests.java +++ b/src/test/java/org/springframework/data/r2dbc/repository/config/R2dbcRepositoriesRegistrarTests.java @@ -32,10 +32,11 @@ import org.springframework.data.r2dbc.core.R2dbcEntityTemplate; import org.springframework.data.r2dbc.core.ReactiveDataAccessStrategy; import org.springframework.data.r2dbc.dialect.MySqlDialect; import org.springframework.data.r2dbc.dialect.PostgresDialect; -import org.springframework.r2dbc.core.DatabaseClient; import org.springframework.data.r2dbc.dialect.SqlServerDialect; import org.springframework.data.r2dbc.repository.config.mysql.MySqlPersonRepository; import org.springframework.data.r2dbc.repository.config.sqlserver.SqlServerPersonRepository; +import org.springframework.r2dbc.core.DatabaseClient; +import org.springframework.r2dbc.core.binding.BindMarkersFactory; /** * Integration tests for {@link R2dbcRepositoriesRegistrar}. @@ -86,8 +87,8 @@ public class R2dbcRepositoriesRegistrarTests { public R2dbcEntityOperations mysqlR2dbcEntityOperations(@Qualifier("mysql") ConnectionFactory connectionFactory) { DefaultReactiveDataAccessStrategy strategy = new DefaultReactiveDataAccessStrategy(MySqlDialect.INSTANCE); - DatabaseClient databaseClient = DatabaseClient.builder().connectionFactory(connectionFactory) - .dataAccessStrategy(strategy).build(); + DatabaseClient databaseClient = DatabaseClient.builder().bindMarkers(BindMarkersFactory.anonymous("?")) + .connectionFactory(connectionFactory).build(); return new R2dbcEntityTemplate(databaseClient, strategy); } @@ -107,8 +108,8 @@ public class R2dbcRepositoriesRegistrarTests { public DatabaseClient sqlserverDatabaseClient( @Qualifier("sqlserverConnectionFactory") ConnectionFactory connectionFactory, @Qualifier("sqlserverDataAccessStrategy") ReactiveDataAccessStrategy mysqlDataAccessStrategy) { - return DatabaseClient.builder().connectionFactory(connectionFactory).dataAccessStrategy(mysqlDataAccessStrategy) - .build(); + return DatabaseClient.builder().connectionFactory(connectionFactory) + .bindMarkers(BindMarkersFactory.anonymous("?")).build(); } @Bean