diff --git a/pom.xml b/pom.xml
index 5d28c8a5c5..db90de1e22 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3806-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index 0033bd11d5..7ba43fe23d 100644
--- a/spring-data-mongodb-benchmarks/pom.xml
+++ b/spring-data-mongodb-benchmarks/pom.xml
@@ -7,7 +7,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3806-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index f62c8dc7f4..448ce456a8 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3806-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 1f157e75bc..7f5ebbe383 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -11,7 +11,7 @@
org.springframework.data
spring-data-mongodb-parent
- 3.3.0-SNAPSHOT
+ 3.3.0-GH-3806-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
index a60c853c33..dc95307c00 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/MappingMongoConverter.java
@@ -1810,6 +1810,10 @@ public T getPropertyValue(MongoPersistentProperty property) {
return (T) dbRefResolver.resolveDbRef(property, dbref, callback, dbRefProxyHandler);
}
+ if(property.isDocumentReference()) {
+ return (T) dbRefResolver.resolveReference(property, accessor.get(property), referenceLookupDelegate, context::convert);
+ }
+
return super.getPropertyValue(property);
}
}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateDocumentReferenceTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateDocumentReferenceTests.java
index d6bcc10e49..e08293a4ff 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateDocumentReferenceTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateDocumentReferenceTests.java
@@ -678,6 +678,52 @@ void loadCollectionReferenceWithMissingRefs() {
assertThat(result.getSimpleValueRef()).containsExactly(new SimpleObjectRef("ref-2", "me-the-2-referenced-object"));
}
+ @Test // GH-3806
+ void resolveReferenceWhenUsedAsCtorArgument() {
+
+ Publisher publisher = new Publisher();
+ publisher.id = "p-111";
+ publisher.name = "ppp";
+
+ template.save(publisher);
+
+ WithRequiredArgsCtor source = new WithRequiredArgsCtor("id-1", publisher);
+
+ template.save(source);
+
+ WithRequiredArgsCtor target = template.findOne(query(where("id").is(source.id)), WithRequiredArgsCtor.class);
+ assertThat(target.publisher).isNotNull();
+ }
+
+ @Test // GH-3806
+ void resolveLazyReferenceWhenUsedAsCtorArgument() {
+
+ Publisher publisher = new Publisher();
+ publisher.id = "p-111";
+ publisher.name = "ppp";
+
+ template.save(publisher);
+
+ WithLazyRequiredArgsCtor source = new WithLazyRequiredArgsCtor("id-1", publisher);
+
+ template.save(source);
+
+ WithLazyRequiredArgsCtor target = template.findOne(query(where("id").is(source.id)), WithLazyRequiredArgsCtor.class);
+
+ // proxy not yet resolved
+ LazyLoadingTestUtils.assertProxy(target.publisher, (proxy) -> {
+
+ assertThat(proxy.isResolved()).isFalse();
+ assertThat(proxy.currentValue()).isNull();
+ });
+
+ // resolve the proxy by invoking a method on it
+ assertThat(target.getPublisher().getName()).isEqualTo("ppp");
+ LazyLoadingTestUtils.assertProxy(target.publisher, (proxy) -> {
+ assertThat(proxy.isResolved()).isTrue();
+ });
+ }
+
@Test // GH-3602
void queryForReference() {
@@ -1283,6 +1329,30 @@ static class Publisher {
String id;
String acronym;
String name;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getAcronym() {
+ return acronym;
+ }
+
+ public void setAcronym(String acronym) {
+ this.acronym = acronym;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
}
@Data
@@ -1293,4 +1363,40 @@ static class UsingAtReference {
@Reference //
Publisher publisher;
}
+
+ static class WithRequiredArgsCtor {
+
+ final String id;
+
+ @DocumentReference
+ final Publisher publisher;
+
+ public WithRequiredArgsCtor(String id, Publisher publisher) {
+
+ this.id = id;
+ this.publisher = publisher;
+ }
+ }
+
+ static class WithLazyRequiredArgsCtor {
+
+ final String id;
+
+ @DocumentReference(lazy = true)
+ final Publisher publisher;
+
+ public WithLazyRequiredArgsCtor(String id, Publisher publisher) {
+
+ this.id = id;
+ this.publisher = publisher;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public Publisher getPublisher() {
+ return publisher;
+ }
+ }
}