From 00cc9120e62b695d79def680a8b70cda09efab64 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 23 Jan 2020 08:48:11 +0100 Subject: [PATCH] #284 - Do not create PersistentEntity for UUID. We now no longer create a PersistentEntity for UUID as UUID is a simple type and introspection on Java 9+ causes illegal access warnings. --- .../r2dbc/mapping/R2dbcMappingContext.java | 11 +++++-- .../r2dbc/mapping/R2dbcSimpleTypeHolder.java | 5 +-- .../mapping/R2dbcMappingContextUnitTests.java | 33 +++++++++++++++++++ 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContext.java b/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContext.java index f5c53ea53..ebddb74be 100644 --- a/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContext.java +++ b/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContext.java @@ -15,8 +15,10 @@ */ package org.springframework.data.r2dbc.mapping; +import org.springframework.core.KotlinDetector; import org.springframework.data.relational.core.mapping.NamingStrategy; import org.springframework.data.relational.core.mapping.RelationalMappingContext; +import org.springframework.data.util.KotlinReflectionUtils; import org.springframework.data.util.TypeInformation; /** @@ -40,12 +42,17 @@ public class R2dbcMappingContext extends RelationalMappingContext { super(namingStrategy); } - /* + /* * (non-Javadoc) * @see org.springframework.data.mapping.context.AbstractMappingContext#shouldCreatePersistentEntityFor(org.springframework.data.util.TypeInformation) */ @Override protected boolean shouldCreatePersistentEntityFor(TypeInformation type) { - return !R2dbcSimpleTypeHolder.HOLDER.isSimpleType(type.getType()); + + if (R2dbcSimpleTypeHolder.HOLDER.isSimpleType(type.getType())) { + return false; + } + + return !KotlinDetector.isKotlinType(type.getType()) || KotlinReflectionUtils.isSupportedKotlinClass(type.getType()); } } diff --git a/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcSimpleTypeHolder.java b/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcSimpleTypeHolder.java index f5bb32e3e..5ff71c1e1 100644 --- a/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcSimpleTypeHolder.java +++ b/src/main/java/org/springframework/data/r2dbc/mapping/R2dbcSimpleTypeHolder.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.Set; +import java.util.UUID; import org.springframework.data.mapping.model.SimpleTypeHolder; @@ -36,8 +37,8 @@ public class R2dbcSimpleTypeHolder extends SimpleTypeHolder { /** * Set of R2DBC simple types. */ - public static final Set> R2DBC_SIMPLE_TYPES = Collections - .unmodifiableSet(new HashSet<>(Arrays.asList(OutboundRow.class, Row.class, BigInteger.class, BigDecimal.class))); + public static final Set> R2DBC_SIMPLE_TYPES = Collections.unmodifiableSet( + new HashSet<>(Arrays.asList(OutboundRow.class, Row.class, BigInteger.class, BigDecimal.class, UUID.class))); public static final SimpleTypeHolder HOLDER = new R2dbcSimpleTypeHolder(); diff --git a/src/test/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContextUnitTests.java b/src/test/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContextUnitTests.java index f9c3713a2..df7032de4 100644 --- a/src/test/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContextUnitTests.java +++ b/src/test/java/org/springframework/data/r2dbc/mapping/R2dbcMappingContextUnitTests.java @@ -19,14 +19,21 @@ import static org.assertj.core.api.Assertions.*; import io.r2dbc.spi.Row; +import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.UUID; import org.junit.Test; import org.springframework.core.convert.converter.Converter; +import org.springframework.data.convert.CustomConversions; import org.springframework.data.convert.ReadingConverter; import org.springframework.data.convert.WritingConverter; import org.springframework.data.r2dbc.convert.R2dbcCustomConversions; +import org.springframework.data.r2dbc.dialect.PostgresDialect; +import org.springframework.data.r2dbc.dialect.R2dbcDialect; /** * Unit tests for {@link R2dbcMappingContext}. @@ -47,6 +54,27 @@ public class R2dbcMappingContextUnitTests { assertThat(context.getPersistentEntity(ConvertedEntity.class)).isNotNull(); } + @Test // gh-284 + public void shouldNotCreateEntityForUUID() { + + R2dbcDialect dialect = PostgresDialect.INSTANCE; + + List converters = new ArrayList<>(dialect.getConverters()); + converters.addAll(R2dbcCustomConversions.STORE_CONVERTERS); + + CustomConversions.StoreConversions storeConversions = CustomConversions.StoreConversions + .of(dialect.getSimpleTypeHolder(), converters); + + R2dbcCustomConversions conversions = new R2dbcCustomConversions(storeConversions, Collections.emptyList()); + + R2dbcMappingContext context = new R2dbcMappingContext(); + context.setSimpleTypeHolder(conversions.getSimpleTypeHolder()); + context.afterPropertiesSet(); + + assertThat(context.getPersistentEntity(MyEntity.class)).isNotNull(); + assertThat(context.getPersistentEntity(UUID.class)).isNull(); + } + static class ConvertedEntity { } @@ -73,4 +101,9 @@ public class R2dbcMappingContextUnitTests { return new ConvertedEntity(); } } + + static class MyEntity { + + UUID id; + } }