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 91da5513..1e9344da 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 @@ -307,7 +307,7 @@ public class MappingRelationalConverter extends AbstractRelationalConverter impl * @return the converted object, will never be {@literal null}. */ protected S readAggregate(ConversionContext context, RowDocument document, - TypeInformation typeHint) { + TypeInformation typeHint) { return readAggregate(context, new RowDocumentAccessor(document), typeHint); } @@ -321,7 +321,7 @@ public class MappingRelationalConverter extends AbstractRelationalConverter impl */ @SuppressWarnings("unchecked") protected S readAggregate(ConversionContext context, RowDocumentAccessor documentAccessor, - TypeInformation typeHint) { + TypeInformation typeHint) { Class rawType = typeHint.getType(); @@ -430,8 +430,7 @@ public class MappingRelationalConverter extends AbstractRelationalConverter impl } @SuppressWarnings("ConstantConditions") - private T doConvert(Object value, Class target, - @Nullable Class fallback) { + private T doConvert(Object value, Class target, @Nullable Class fallback) { if (getConversionService().canConvert(value.getClass(), target) || fallback == null) { return getConversionService().convert(value, target); @@ -504,7 +503,7 @@ public class MappingRelationalConverter extends AbstractRelationalConverter impl entity, contextualizing, context.getPath().getCurrentObject()); return new ConverterAwareSpELExpressionParameterValueProvider(context, evaluator, getConversionService(), - new ConvertingParameterValueProvider<>( parameterProvider::getParameterValue)); + new ConvertingParameterValueProvider<>(parameterProvider::getParameterValue)); } private S populateProperties(ConversionContext context, RelationalPersistentEntity entity, @@ -641,6 +640,11 @@ public class MappingRelationalConverter extends AbstractRelationalConverter impl protected Object getPotentiallyConvertedSimpleRead(Object value, TypeInformation type) { Class target = type.getType(); + + if (getConversions().hasCustomReadTarget(value.getClass(), target)) { + return getConversionService().convert(value, TypeDescriptor.forObject(value), createTypeDescriptor(type)); + } + if (ClassUtils.isAssignableValue(target, value)) { return value; } @@ -787,8 +791,7 @@ public class MappingRelationalConverter extends AbstractRelationalConverter impl @SuppressWarnings("unchecked") @Override - public S convert(Object source, TypeInformation typeHint, - ConversionContext context) { + public S convert(Object source, TypeInformation typeHint, ConversionContext context) { Assert.notNull(source, "Source must not be null"); Assert.notNull(typeHint, "TypeInformation must not be null"); @@ -1196,7 +1199,8 @@ public class MappingRelationalConverter extends AbstractRelationalConverter impl } } - private record PropertyTranslatingPropertyAccessor (PersistentPropertyAccessor delegate, + private record PropertyTranslatingPropertyAccessor( + PersistentPropertyAccessor delegate, PersistentPropertyTranslator propertyTranslator) implements PersistentPropertyAccessor { static PersistentPropertyAccessor create(PersistentPropertyAccessor delegate, 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 b869fc1e..d5759c85 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,6 +17,7 @@ package org.springframework.data.relational.core.conversion; import static org.assertj.core.api.Assertions.*; +import java.util.Arrays; import java.util.Collections; import java.util.Date; import java.util.EnumSet; @@ -26,13 +27,16 @@ import java.util.Objects; import java.util.Set; import org.junit.jupiter.api.Test; + import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.convert.converter.Converter; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.PersistenceCreator; import org.springframework.data.convert.ConverterBuilder; import org.springframework.data.convert.ConverterBuilder.ConverterAware; import org.springframework.data.convert.CustomConversions; import org.springframework.data.convert.CustomConversions.StoreConversions; +import org.springframework.data.convert.ReadingConverter; import org.springframework.data.mapping.model.SimpleTypeHolder; import org.springframework.data.projection.EntityProjection; import org.springframework.data.relational.core.mapping.Column; @@ -83,6 +87,20 @@ class MappingRelationalConverterUnitTests { assertThat(result.name).isEqualTo("bar"); } + @Test + // GH-1689 + void shouldApplySimpleTypeConverterSimpleType() { + + converter = new MappingRelationalConverter(converter.getMappingContext(), + new CustomConversions(StoreConversions.NONE, List.of(MyEnumConverter.INSTANCE))); + + RowDocument document = new RowDocument().append("my_enum", "one"); + + WithMyEnum result = converter.read(WithMyEnum.class, document); + + assertThat(result.myEnum).isEqualTo(MyEnum.ONE); + } + @Test // GH-1586 void shouldReadNonstaticInner() { @@ -328,4 +346,23 @@ class MappingRelationalConverterUnitTests { String getStreet(); } + record WithMyEnum(MyEnum myEnum) { + } + + enum MyEnum { + ONE, TWO, + } + + @ReadingConverter + enum MyEnumConverter implements Converter { + + INSTANCE; + + @Override + public MyEnum convert(String source) { + return MyEnum.valueOf(source.toUpperCase()); + } + + } + }