From a1ecd4a501d7ac8e75db071c7f5214ccc72f856d Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Thu, 17 Jul 2014 11:16:22 +0200 Subject: [PATCH] DATAMONGO-987 - Avoid creation of lazy-loading proxies for null-values. We now avoid creating a lazy-loading proxy if we detect that the property-value in the backing DbObject for a @Lazy(true) annotated field is null. Original pull request: #207. --- .../core/convert/MappingMongoConverter.java | 5 +++++ .../DbRefMappingMongoConverterUnitTests.java | 21 +++++++++++++++++++ 2 files changed, 26 insertions(+) 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 9267e27dc..9121cd8d8 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 @@ -265,6 +265,11 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App MongoPersistentProperty property = association.getInverse(); Object value = dbo.get(property.getName()); + + if (value == null) { + return; + } + DBRef dbref = value instanceof DBRef ? (DBRef) value : null; Object obj = dbRefResolver.resolveDbRef(property, dbref, new DbRefResolverCallback() { diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/DbRefMappingMongoConverterUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/DbRefMappingMongoConverterUnitTests.java index 04c4a66ea..0bb6a1fe7 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/DbRefMappingMongoConverterUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/DbRefMappingMongoConverterUnitTests.java @@ -429,6 +429,27 @@ public class DbRefMappingMongoConverterUnitTests { assertProxyIsResolved(result.dbRefEqualsAndHashcodeObjectMethodOverride2, true); } + /** + * @see DATAMONGO-987 + */ + @Test + public void shouldNotGenerateLazyLoadingProxyForNullValues() { + + DBObject dbo = new BasicDBObject(); + ClassWithLazyDbRefs lazyDbRefs = new ClassWithLazyDbRefs(); + lazyDbRefs.id = "42"; + converter.write(lazyDbRefs, dbo); + + ClassWithLazyDbRefs result = converter.read(ClassWithLazyDbRefs.class, dbo); + + assertThat(result.id, is(lazyDbRefs.id)); + assertThat(result.dbRefToInterface, is(nullValue())); + assertThat(result.dbRefToConcreteCollection, is(nullValue())); + assertThat(result.dbRefToConcreteType, is(nullValue())); + assertThat(result.dbRefToConcreteTypeWithPersistenceConstructor, is(nullValue())); + assertThat(result.dbRefToConcreteTypeWithPersistenceConstructorWithoutDefaultConstructor, is(nullValue())); + } + private Object transport(Object result) { return SerializationUtils.deserialize(SerializationUtils.serialize(result)); }