diff --git a/pom.xml b/pom.xml
index c1b0761359..a4e7f221a0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-commons
- 2.4.0-SNAPSHOT
+ 2.4.0-DATACMNS-1734-SNAPSHOT
Spring Data Core
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 740c99de47..01080cdfb2 100644
--- a/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java
+++ b/src/main/java/org/springframework/data/repository/support/DomainClassConverter.java
@@ -30,6 +30,7 @@
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.core.EntityInformation;
import org.springframework.data.repository.core.RepositoryInformation;
+import org.springframework.data.util.Lazy;
import org.springframework.lang.Nullable;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@@ -47,7 +48,7 @@ public class DomainClassConverter repositories = Lazy.of(Repositories.NONE);
private Optional toEntityConverter = Optional.empty();
private Optional toIdConverter = Optional.empty();
@@ -97,7 +98,7 @@ public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
* @return
*/
private Optional extends ConditionalGenericConverter> getConverter(TypeDescriptor targetType) {
- return repositories.hasRepositoryFor(targetType.getType()) ? toEntityConverter : toIdConverter;
+ return repositories.get().hasRepositoryFor(targetType.getType()) ? toEntityConverter : toIdConverter;
}
/*
@@ -106,13 +107,18 @@ private Optional extends ConditionalGenericConverter> getConverter(TypeDescrip
*/
public void setApplicationContext(ApplicationContext context) {
- this.repositories = new Repositories(context);
+ this.repositories = Lazy.of(() -> {
- this.toEntityConverter = Optional.of(new ToEntityConverter(this.repositories, this.conversionService));
- this.toEntityConverter.ifPresent(it -> this.conversionService.addConverter(it));
+ Repositories repositories = new Repositories(context);
- this.toIdConverter = Optional.of(new ToIdConverter());
- this.toIdConverter.ifPresent(it -> this.conversionService.addConverter(it));
+ this.toEntityConverter = Optional.of(new ToEntityConverter(repositories, conversionService));
+ this.toEntityConverter.ifPresent(it -> conversionService.addConverter(it));
+
+ this.toIdConverter = Optional.of(new ToIdConverter(repositories, conversionService));
+ this.toIdConverter.ifPresent(it -> conversionService.addConverter(it));
+
+ return repositories;
+ });
}
/**
@@ -121,9 +127,11 @@ public void setApplicationContext(ApplicationContext context) {
* @author Oliver Gierke
* @since 1.10
*/
- private class ToEntityConverter implements ConditionalGenericConverter {
+ private static class ToEntityConverter implements ConditionalGenericConverter {
private final RepositoryInvokerFactory repositoryInvokerFactory;
+ private final Repositories repositories;
+ private final ConversionService conversionService;
/**
* Creates a new {@link ToEntityConverter} for the given {@link Repositories} and {@link ConversionService}.
@@ -132,7 +140,10 @@ private class ToEntityConverter implements ConditionalGenericConverter {
* @param conversionService must not be {@literal null}.
*/
public ToEntityConverter(Repositories repositories, ConversionService conversionService) {
+
this.repositoryInvokerFactory = new DefaultRepositoryInvokerFactory(repositories, conversionService);
+ this.repositories = repositories;
+ this.conversionService = conversionService;
}
/*
@@ -206,7 +217,16 @@ public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
* @author Oliver Gierke
* @since 1.10
*/
- class ToIdConverter implements ConditionalGenericConverter {
+ static class ToIdConverter implements ConditionalGenericConverter {
+
+ private final Repositories repositories;
+ private final ConversionService conversionService;
+
+ public ToIdConverter(Repositories repositories, ConversionService conversionService) {
+
+ this.repositories = repositories;
+ this.conversionService = conversionService;
+ }
/*
* (non-Javadoc)
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 65c1f9c941..0c8282d86b 100755
--- a/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java
+++ b/src/test/java/org/springframework/data/repository/support/DomainClassConverterUnitTests.java
@@ -29,7 +29,6 @@
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.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
@@ -181,6 +180,7 @@ void supportsConversionFromEntityToString() {
void toIdConverterDoesNotMatchIfTargetTypeIsAssignableFromSource() throws NoSuchMethodException {
converter.setApplicationContext(initContextWithRepo());
+ assertMatches(false);
@SuppressWarnings("rawtypes")
Optional toIdConverter = (Optional) ReflectionTestUtils.getField(converter,