From dfdec7bbafbda2c704097caf64f2b690681d5045 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Sun, 8 Sep 2024 04:02:22 +0700 Subject: [PATCH 1/3] converter condition --- .../MappingRelationalConverter.java | 17 ++++--- .../MappingRelationalConverterUnitTests.java | 51 +++++++++++++++++++ 2 files changed, 62 insertions(+), 6 deletions(-) diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java index f783f7b323..9fb5e8284e 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java @@ -693,7 +693,9 @@ public Object writeValue(@Nullable Object value, TypeInformation type) { if (getConversions().isSimpleType(value.getClass())) { - Optional> customWriteTarget = getConversions().getCustomWriteTarget(type.getType()); + Optional> customWriteTarget = getConversions().hasCustomWriteTarget(type.getType(), value.getClass()) + ? getConversions().getCustomWriteTarget(type.getType(), value.getClass()) + : getConversions().getCustomWriteTarget(type.getType()); if (customWriteTarget.isPresent()) { return getConversionService().convert(value, customWriteTarget.get()); } @@ -725,17 +727,20 @@ public Object writeValue(@Nullable Object value, TypeInformation type) { return writeCollection((Iterable) value, type); } - RelationalPersistentEntity persistentEntity = getMappingContext().getPersistentEntity(value.getClass()); + if (getMappingContext().hasPersistentEntityFor(value.getClass())) { - if (persistentEntity != null) { + RelationalPersistentEntity persistentEntity = getMappingContext().getPersistentEntity(value.getClass()); - Object id = persistentEntity.getIdentifierAccessor(value).getIdentifier(); - return writeValue(id, type); + if (persistentEntity != null) { + + Object id = persistentEntity.getIdentifierAccessor(value).getIdentifier(); + return writeValue(id, type); + } } return - getConversionService().convert(value, type.getType()); + getConversionService().convert(value, type.getType()); } private Object writeArray(Object value, TypeInformation type) { diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/conversion/MappingRelationalConverterUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/conversion/MappingRelationalConverterUnitTests.java index c8a88ab390..cc9b4d8fb2 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/conversion/MappingRelationalConverterUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/conversion/MappingRelationalConverterUnitTests.java @@ -26,10 +26,13 @@ import java.util.Objects; import java.util.Set; +import java.util.UUID; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.convert.TypeDescriptor; import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.GenericConverter; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.PersistenceCreator; import org.springframework.data.convert.ConverterBuilder; @@ -43,6 +46,7 @@ import org.springframework.data.relational.core.mapping.Embedded; import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.domain.RowDocument; +import org.springframework.data.util.TypeInformation; /** * Unit tests for {@link MappingRelationalConverter}. @@ -210,6 +214,27 @@ void projectShouldReadProjectionWithNestedEntity() { assertThat(person.getAddresses()).extracting(Address::getStreet).hasSize(1).containsOnly("hwy"); } + @SuppressWarnings("unchecked") + @Test + void shouldApplyGenericTypeConverter() { + + converter = new MappingRelationalConverter(converter.getMappingContext(), + new CustomConversions(StoreConversions.NONE, List.of(GenericTypeConverter.INSTANCE))); + + var stringResult = (GenericClass) converter.writeValue("test", TypeInformation.of(GenericClass.class)); + var uuidResult = (GenericClass) converter.writeValue(UUID.fromString("1234567-8910-1112-1314-151617181920"), TypeInformation.of(GenericClass.class)); + + var stringGeneric = new GenericClass<>("test"); + var stringGenericResult = (String) converter.writeValue(stringGeneric, TypeInformation.of(String.class)); + var uuidGeneric = new GenericClass<>(UUID.fromString("1234567-8910-1112-1314-151617181920")); + var uuidGenericResult = (UUID) converter.writeValue(uuidGeneric, TypeInformation.of(UUID.class)); + + assertThat(stringResult.value()).isEqualTo("test"); + assertThat(uuidResult.value()).isEqualTo(UUID.fromString("1234567-8910-1112-1314-151617181920")); + assertThat(stringGenericResult).isEqualTo("test"); + assertThat(uuidGenericResult).isEqualTo(UUID.fromString("1234567-8910-1112-1314-151617181920")); + } + static class SimpleType { @Id String id; @@ -365,4 +390,30 @@ public MyEnum convert(String source) { } + enum GenericTypeConverter implements GenericConverter { + + INSTANCE; + + @Override + public Set getConvertibleTypes() { + return Set.of( + new ConvertiblePair(String.class, GenericClass.class), + new ConvertiblePair(UUID.class, GenericClass.class), + new ConvertiblePair(GenericClass.class, String.class), + new ConvertiblePair(GenericClass.class, UUID.class) + ); + } + + @Override + public Object convert(Object source, TypeDescriptor sourceType, TypeDescriptor targetType) { + if (targetType.getType() == GenericClass.class) + return new GenericClass<>(source); + + return ((GenericClass) source).value(); + } + + } + + public record GenericClass(T value) { } + } From 956cf75137fa9e7c4234b7c3b10baaf4a53f7af3 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Sun, 8 Sep 2024 04:04:01 +0700 Subject: [PATCH 2/3] revert space --- .../relational/core/conversion/MappingRelationalConverter.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java index 9fb5e8284e..b4b5b6fd68 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java @@ -740,7 +740,7 @@ public Object writeValue(@Nullable Object value, TypeInformation type) { return - getConversionService().convert(value, type.getType()); + getConversionService().convert(value, type.getType()); } private Object writeArray(Object value, TypeInformation type) { From 7031786c140901115e90ec6e5a1846ae10e3cc63 Mon Sep 17 00:00:00 2001 From: Tran Ngoc Nhan Date: Thu, 12 Sep 2024 20:20:07 +0700 Subject: [PATCH 3/3] update convert --- .../core/conversion/MappingRelationalConverter.java | 4 ++-- .../core/conversion/MappingRelationalConverterUnitTests.java | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java b/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java index b4b5b6fd68..9ea28fd603 100644 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/core/conversion/MappingRelationalConverter.java @@ -693,8 +693,8 @@ public Object writeValue(@Nullable Object value, TypeInformation type) { if (getConversions().isSimpleType(value.getClass())) { - Optional> customWriteTarget = getConversions().hasCustomWriteTarget(type.getType(), value.getClass()) - ? getConversions().getCustomWriteTarget(type.getType(), value.getClass()) + Optional> customWriteTarget = getConversions().hasCustomWriteTarget(value.getClass(), type.getType()) + ? getConversions().getCustomWriteTarget(value.getClass(), type.getType()) : getConversions().getCustomWriteTarget(type.getType()); if (customWriteTarget.isPresent()) { return getConversionService().convert(value, customWriteTarget.get()); diff --git a/spring-data-relational/src/test/java/org/springframework/data/relational/core/conversion/MappingRelationalConverterUnitTests.java b/spring-data-relational/src/test/java/org/springframework/data/relational/core/conversion/MappingRelationalConverterUnitTests.java index cc9b4d8fb2..e30bdb10e1 100644 --- a/spring-data-relational/src/test/java/org/springframework/data/relational/core/conversion/MappingRelationalConverterUnitTests.java +++ b/spring-data-relational/src/test/java/org/springframework/data/relational/core/conversion/MappingRelationalConverterUnitTests.java @@ -17,7 +17,6 @@ import static org.assertj.core.api.Assertions.*; -import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.EnumSet; @@ -40,6 +39,7 @@ import org.springframework.data.convert.CustomConversions; import org.springframework.data.convert.CustomConversions.StoreConversions; import org.springframework.data.convert.ReadingConverter; +import org.springframework.data.convert.WritingConverter; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.projection.EntityProjection; import org.springframework.data.relational.core.mapping.Column; @@ -390,6 +390,7 @@ public MyEnum convert(String source) { } + @WritingConverter enum GenericTypeConverter implements GenericConverter { INSTANCE;