From dfaaa51a34e9689d26a2c926126a9385aa1d0a00 Mon Sep 17 00:00:00 2001 From: Jens Schauder Date: Fri, 14 May 2021 10:36:49 +0200 Subject: [PATCH] Fixes build failures with JDK16. `JdbcMappingContext` sets the SimpleTypeHolder to `JdbcSimpleTypeHolder.HOLDER` by default. Fixing test failures where properties of type `UUID` were considered an entity by the `MappingContext`. This in turn triggered failures when it tried to make fields of `UUID` accessible. Removed the `UUID` field from a test entity in SD Relational, since `UUID` is not a simple type for Relational, nor a proper entity. Replaced `@PostConstruct` with `InitializingBean` in test data source conifgurations in order avoid the requirement of importing javax.annotation-api. Closes #975 --- .../jdbc/core/mapping/JdbcMappingContext.java | 2 ++ ...ractJdbcConfigurationIntegrationTests.java | 36 ++++++++++++++++++- .../MariaDBDataSourceConfiguration.java | 14 ++++---- .../testing/MySqlDataSourceConfiguration.java | 16 ++++----- ...RelationalPersistentPropertyUnitTests.java | 11 +++--- 5 files changed, 55 insertions(+), 24 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/mapping/JdbcMappingContext.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/mapping/JdbcMappingContext.java index 7ff34cc88..f5a9f6f78 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/mapping/JdbcMappingContext.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/mapping/JdbcMappingContext.java @@ -46,6 +46,7 @@ public class JdbcMappingContext extends RelationalMappingContext { */ public JdbcMappingContext() { super(); + setSimpleTypeHolder(JdbcSimpleTypes.HOLDER); } /** @@ -55,6 +56,7 @@ public class JdbcMappingContext extends RelationalMappingContext { */ public JdbcMappingContext(NamingStrategy namingStrategy) { super(namingStrategy); + setSimpleTypeHolder(JdbcSimpleTypes.HOLDER); } /* diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java index 9633aac98..1ec72619c 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/config/AbstractJdbcConfigurationIntegrationTests.java @@ -19,6 +19,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.function.Consumer; @@ -27,6 +28,8 @@ import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; +import org.springframework.data.convert.WritingConverter; import org.springframework.data.jdbc.core.JdbcAggregateTemplate; import org.springframework.data.jdbc.core.convert.DataAccessStrategy; import org.springframework.data.jdbc.core.convert.JdbcConverter; @@ -46,7 +49,7 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; public class AbstractJdbcConfigurationIntegrationTests { @Test // DATAJDBC-395 - public void configuresInfrastructureComponents() { + void configuresInfrastructureComponents() { assertApplicationContext(context -> { @@ -63,6 +66,18 @@ public class AbstractJdbcConfigurationIntegrationTests { }, AbstractJdbcConfigurationUnderTest.class, Infrastructure.class); } + @Test // #975 + void registersSimpleTypesFromCustomConversions() { + + assertApplicationContext(context -> { + JdbcMappingContext mappingContext = context.getBean(JdbcMappingContext.class); + assertThat( // + mappingContext.getPersistentEntity(AbstractJdbcConfigurationUnderTest.Blah.class) // + ).describedAs("Blah should not be an entity, since there is a WritingConversion configured for it") // + .isNull(); + }, AbstractJdbcConfigurationUnderTest.class, Infrastructure.class); + } + protected static void assertApplicationContext(Consumer verification, Class... configurationClasses) { @@ -93,6 +108,25 @@ public class AbstractJdbcConfigurationIntegrationTests { public Dialect jdbcDialect(NamedParameterJdbcOperations operations) { return HsqlDbDialect.INSTANCE; } + + @Override + public JdbcCustomConversions jdbcCustomConversions() { + return new JdbcCustomConversions(Collections.singletonList(Blah2BlubbConverter.INSTANCE)); + } + + @WritingConverter + enum Blah2BlubbConverter implements Converter { + INSTANCE; + + @Override + public Blubb convert(Blah blah) { + return new Blubb(); + } + } + + private static class Blah {} + + private static class Blubb {} } } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/MariaDBDataSourceConfiguration.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/MariaDBDataSourceConfiguration.java index d9acad854..d703bf68c 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/MariaDBDataSourceConfiguration.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/MariaDBDataSourceConfiguration.java @@ -18,10 +18,10 @@ package org.springframework.data.jdbc.testing; import java.sql.Connection; import java.sql.SQLException; -import javax.annotation.PostConstruct; import javax.sql.DataSource; import org.mariadb.jdbc.MariaDbDataSource; +import org.springframework.beans.factory.InitializingBean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.core.io.ByteArrayResource; @@ -33,10 +33,11 @@ import org.testcontainers.containers.MariaDBContainer; * * @author Christoph Preißner * @author Mark Paluch + * @author Jens Schauder */ @Configuration @Profile("mariadb") -class MariaDBDataSourceConfiguration extends DataSourceConfiguration { +class MariaDBDataSourceConfiguration extends DataSourceConfiguration implements InitializingBean { private static MariaDBContainer MARIADB_CONTAINER; @@ -49,9 +50,7 @@ class MariaDBDataSourceConfiguration extends DataSourceConfiguration { if (MARIADB_CONTAINER == null) { - MariaDBContainer container = new MariaDBContainer<>("mariadb:10.5") - .withUsername("root") - .withPassword("") + MariaDBContainer container = new MariaDBContainer<>("mariadb:10.5").withUsername("root").withPassword("") .withConfigurationOverride(""); container.start(); @@ -70,13 +69,12 @@ class MariaDBDataSourceConfiguration extends DataSourceConfiguration { } } - @PostConstruct - public void initDatabase() throws SQLException { + @Override + public void afterPropertiesSet() throws Exception { try (Connection connection = createDataSource().getConnection()) { ScriptUtils.executeSqlScript(connection, new ByteArrayResource("DROP DATABASE test;CREATE DATABASE test;".getBytes())); } } - } diff --git a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java index cf14ec974..8da00a774 100644 --- a/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java +++ b/spring-data-jdbc/src/test/java/org/springframework/data/jdbc/testing/MySqlDataSourceConfiguration.java @@ -16,18 +16,18 @@ package org.springframework.data.jdbc.testing; import java.sql.Connection; -import java.sql.SQLException; -import javax.annotation.PostConstruct; import javax.sql.DataSource; -import com.mysql.cj.jdbc.MysqlDataSource; +import org.springframework.beans.factory.InitializingBean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Profile; import org.springframework.core.io.ByteArrayResource; import org.springframework.jdbc.datasource.init.ScriptUtils; import org.testcontainers.containers.MySQLContainer; +import com.mysql.cj.jdbc.MysqlDataSource; + /** * {@link DataSource} setup for MySQL. Starts a docker container with a MySql database and sets up a database name * "test" in it. @@ -39,7 +39,7 @@ import org.testcontainers.containers.MySQLContainer; */ @Configuration @Profile("mysql") -class MySqlDataSourceConfiguration extends DataSourceConfiguration { +class MySqlDataSourceConfiguration extends DataSourceConfiguration implements InitializingBean { private static MySQLContainer MYSQL_CONTAINER; @@ -52,9 +52,7 @@ class MySqlDataSourceConfiguration extends DataSourceConfiguration { if (MYSQL_CONTAINER == null) { - MySQLContainer container = new MySQLContainer<>("mysql:8.0.24") - .withUsername("test") - .withPassword("test") + MySQLContainer container = new MySQLContainer<>("mysql:8.0.24").withUsername("test").withPassword("test") .withConfigurationOverride(""); container.start(); @@ -71,8 +69,8 @@ class MySqlDataSourceConfiguration extends DataSourceConfiguration { return dataSource; } - @PostConstruct - public void initDatabase() throws SQLException { + @Override + public void afterPropertiesSet() throws Exception { try (Connection connection = createDataSource().getConnection()) { ScriptUtils.executeSqlScript(connection, diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentPropertyUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentPropertyUnitTests.java index c3883fc55..d196e4956 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentPropertyUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/mapping/BasicRelationalPersistentPropertyUnitTests.java @@ -25,7 +25,6 @@ import java.time.LocalDateTime; import java.time.ZonedDateTime; import java.util.Date; import java.util.List; -import java.util.UUID; import java.util.function.BiConsumer; import org.assertj.core.api.SoftAssertions; @@ -47,7 +46,6 @@ public class BasicRelationalPersistentPropertyUnitTests { RelationalMappingContext context = new RelationalMappingContext(); RelationalPersistentEntity entity = context.getRequiredPersistentEntity(DummyEntity.class); - @Test // DATAJDBC-106 public void detectsAnnotatedColumnName() { @@ -61,9 +59,12 @@ public class BasicRelationalPersistentPropertyUnitTests { RelationalPersistentProperty listProperty = entity.getRequiredPersistentProperty("someList"); - PersistentPropertyPath path = context.findPersistentPropertyPaths(DummyEntity.class, p -> p.getName().equals("someList")).getFirst().orElseThrow(() -> new AssertionFailedError("Couldn't find path for 'someList'")); + PersistentPropertyPath path = context + .findPersistentPropertyPaths(DummyEntity.class, p -> p.getName().equals("someList")).getFirst() + .orElseThrow(() -> new AssertionFailedError("Couldn't find path for 'someList'")); - assertThat(listProperty.getReverseColumnName(new PersistentPropertyPathExtension(context, path))).isEqualTo(quoted("dummy_column_name")); + assertThat(listProperty.getReverseColumnName(new PersistentPropertyPathExtension(context, path))) + .isEqualTo(quoted("dummy_column_name")); assertThat(listProperty.getKeyColumn()).isEqualTo(quoted("dummy_key_column_name")); } @@ -127,7 +128,6 @@ public class BasicRelationalPersistentPropertyUnitTests { softly.assertAll(); } - @Data @SuppressWarnings("unused") private static class DummyEntity { @@ -136,7 +136,6 @@ public class BasicRelationalPersistentPropertyUnitTests { private final SomeEnum someEnum; private final LocalDateTime localDateTime; private final ZonedDateTime zonedDateTime; - private final UUID uuid; // DATAJDBC-259 private final List listOfString;