From ba012ff25b82af72f5de2c64a16888bf2c0e68f4 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 16 Jun 2020 11:48:59 +0200 Subject: [PATCH] DATACMNS-1743 - Fixed handling of failed aggregate lookup in DomainClassConverter. We now fall back to null in case the repository lookup for the aggregate results in an absent value rather than returning the source unconverted. --- .../support/DomainClassConverter.java | 2 +- .../support/DomainClassConverterUnitTests.java | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) 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);