From fb944b3b984db76490e1c3c97b4c9b6ebea05ac8 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Mon, 15 Jun 2020 22:09:39 +0200 Subject: [PATCH] DATACMNS-1743 - Fix lazy repository lookups in DomainClassConverter. We now eagerly register DomainClassConverter as converter with the ConversionService in the web setup. We also refrain from explicitly registering the traget converters with the ConversionService as that might trigger a ConcurrentModificationException if called during an iteration over the converters in the first place. As DomainClassConverter registers itself for all ConvertiblePairs and delegates to the individual converters anyway. --- .../data/repository/support/DomainClassConverter.java | 4 +--- .../support/DomainClassConverterUnitTests.java | 11 +++++++++++ 2 files changed, 12 insertions(+), 3 deletions(-) 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 01080cdfb..828c5ff3a 100644 --- a/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java +++ b/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java @@ -62,6 +62,7 @@ public class DomainClassConverter conversionService.addConverter(it)); - this.toIdConverter = Optional.of(new ToIdConverter(repositories, conversionService)); - this.toIdConverter.ifPresent(it -> conversionService.addConverter(it)); return repositories; }); 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 0c8282d86..29ae01b8c 100755 --- a/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java +++ b/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java @@ -36,6 +36,7 @@ import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.MethodParameter; import org.springframework.core.convert.TypeDescriptor; +import org.springframework.core.convert.support.ConfigurableConversionService; import org.springframework.core.convert.support.DefaultConversionService; import org.springframework.data.repository.CrudRepository; import org.springframework.data.repository.core.support.DummyRepositoryFactoryBean; @@ -192,6 +193,16 @@ class DomainClassConverterUnitTests { assertThat(toIdConverter).map(it -> it.matches(SUB_USER_TYPE, target)).hasValue(false); } + @Test // DATACMNS-1743 + void registersConvertersOnConversionService() { + + ConfigurableConversionService conversionService = new DefaultConversionService(); + DomainClassConverter converter = new DomainClassConverter<>(conversionService); + converter.setApplicationContext(initContextWithRepo()); + + assertThat(conversionService.canConvert(String.class, User.class)).isTrue(); + } + private ApplicationContext initContextWithRepo() { BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(DummyRepositoryFactoryBean.class);