From aa1c1d4f15b382c17686a50417d33afa7eb4d166 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);