diff --git a/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java b/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java index 828c5ff3a..d7fa74985 100644 --- a/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java +++ b/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java @@ -82,7 +82,7 @@ public class DomainClassConverter it.convert(source, sourceType, targetType)).orElse(source); + return getConverter(targetType).map(it -> it.convert(source, sourceType, targetType)).orElse(null); } /* diff --git a/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java b/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java index 29ae01b8c..a2bb29c04 100755 --- a/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java +++ b/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java @@ -30,6 +30,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; import org.springframework.aop.framework.Advised; +import org.springframework.aop.framework.AopProxyUtils; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationContext; @@ -203,6 +204,23 @@ class DomainClassConverterUnitTests { assertThat(conversionService.canConvert(String.class, User.class)).isTrue(); } + @Test // DATACMNS-1743 + void returnsNullForFailedLookup() { + + ApplicationContext context = initContextWithRepo(); + converter.setApplicationContext(context); + + // Expect ID conversion + doReturn(4711L).when(service).convert("4711", Long.class); + + // Configure aggregate lookup to fail + UserRepository users = context.getBean(UserRepository.class); + users = (UserRepository) AopProxyUtils.getSingletonTarget(users); + doReturn(Optional.empty()).when(users).findById(any()); + + assertThat(converter.convert("4711", STRING_TYPE, USER_TYPE)).isNull(); + } + private ApplicationContext initContextWithRepo() { BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(DummyRepositoryFactoryBean.class);