diff --git a/spring-data-mongodb-parent/pom.xml b/spring-data-mongodb-parent/pom.xml
index ccd7d1243..56c556b58 100644
--- a/spring-data-mongodb-parent/pom.xml
+++ b/spring-data-mongodb-parent/pom.xml
@@ -19,7 +19,7 @@
3.0.7.RELEASE
4.0.0.RELEASE
[${org.springframework.version.30}, ${org.springframework.version.40})
- 1.3.0.M1
+ 1.3.0.BUILD-SNAPSHOT
1.6.11.RELEASE
@@ -245,8 +245,8 @@
- spring-libs-milestone
- http://repo.springsource.org/libs-milestone
+ spring-libs-snapshot
+ http://repo.springsource.org/libs-snapshot
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 faf8e9532..ea11e714f 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
@@ -169,8 +169,12 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
return read(ClassTypeInformation.from(clazz), dbo);
}
- @SuppressWarnings("unchecked")
protected S read(TypeInformation type, DBObject dbo) {
+ return read(type, dbo, null);
+ }
+
+ @SuppressWarnings("unchecked")
+ protected S read(TypeInformation type, DBObject dbo, Object parent) {
if (null == dbo) {
return null;
@@ -188,11 +192,11 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
}
if (typeToUse.isCollectionLike() && dbo instanceof BasicDBList) {
- return (S) readCollectionOrArray(typeToUse, (BasicDBList) dbo);
+ return (S) readCollectionOrArray(typeToUse, (BasicDBList) dbo, parent);
}
if (typeToUse.isMap()) {
- return (S) readMap(typeToUse, dbo);
+ return (S) readMap(typeToUse, dbo, parent);
}
// Retrieve persistent entity info
@@ -202,29 +206,30 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
throw new MappingException("No mapping metadata found for " + rawType.getName());
}
- return read(persistentEntity, dbo);
+ return read(persistentEntity, dbo, parent);
}
private ParameterValueProvider getParameterProvider(MongoPersistentEntity> entity,
- DBObject source, DefaultSpELExpressionEvaluator evaluator) {
+ DBObject source, DefaultSpELExpressionEvaluator evaluator, Object parent) {
- MongoDbPropertyValueProvider provider = new MongoDbPropertyValueProvider(source, evaluator);
+ MongoDbPropertyValueProvider provider = new MongoDbPropertyValueProvider(source, evaluator, parent);
PersistentEntityParameterValueProvider parameterProvider = new PersistentEntityParameterValueProvider(
- entity, provider);
+ entity, provider, parent);
parameterProvider.setSpELEvaluator(evaluator);
return parameterProvider;
}
- private S read(final MongoPersistentEntity entity, final DBObject dbo) {
+ private S read(final MongoPersistentEntity entity, final DBObject dbo, Object parent) {
final DefaultSpELExpressionEvaluator evaluator = new DefaultSpELExpressionEvaluator(dbo, spELContext);
- ParameterValueProvider provider = getParameterProvider(entity, dbo, evaluator);
+ ParameterValueProvider provider = getParameterProvider(entity, dbo, evaluator, parent);
EntityInstantiator instantiator = instantiators.getInstantiatorFor(entity);
S instance = instantiator.createInstance(entity, provider);
final BeanWrapper, S> wrapper = BeanWrapper.create(instance, conversionService);
+ final S result = wrapper.getBean();
// Set properties not already set in the constructor
entity.doWithProperties(new PropertyHandler() {
@@ -237,7 +242,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
return;
}
- Object obj = getValueInternal(prop, dbo, evaluator);
+ Object obj = getValueInternal(prop, dbo, evaluator, result);
wrapper.setProperty(prop, obj, useFieldAccessOnly);
}
});
@@ -246,7 +251,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
entity.doWithAssociations(new AssociationHandler() {
public void doWithAssociation(Association association) {
MongoPersistentProperty inverseProp = association.getInverse();
- Object obj = getValueInternal(inverseProp, dbo, evaluator);
+ Object obj = getValueInternal(inverseProp, dbo, evaluator, result);
try {
wrapper.setProperty(inverseProp, obj);
} catch (IllegalAccessException e) {
@@ -257,7 +262,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
}
});
- return wrapper.getBean();
+ return result;
}
/**
@@ -677,9 +682,10 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
return new DBRef(db, collection, idMapper.convertId(id));
}
- protected Object getValueInternal(MongoPersistentProperty prop, DBObject dbo, SpELExpressionEvaluator eval) {
+ protected Object getValueInternal(MongoPersistentProperty prop, DBObject dbo, SpELExpressionEvaluator eval,
+ Object parent) {
- MongoDbPropertyValueProvider provider = new MongoDbPropertyValueProvider(dbo, spELContext);
+ MongoDbPropertyValueProvider provider = new MongoDbPropertyValueProvider(dbo, spELContext, parent);
return provider.getPropertyValue(prop);
}
@@ -691,7 +697,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
* @return the converted {@link Collections}, will never be {@literal null}.
*/
@SuppressWarnings("unchecked")
- private Collection> readCollectionOrArray(TypeInformation> targetType, BasicDBList sourceValue) {
+ private Collection> readCollectionOrArray(TypeInformation> targetType, BasicDBList sourceValue, Object parent) {
Assert.notNull(targetType);
@@ -704,9 +710,9 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
for (int i = 0; i < sourceValue.size(); i++) {
Object dbObjItem = sourceValue.get(i);
if (dbObjItem instanceof DBRef) {
- items.add(read(targetType.getComponentType(), ((DBRef) dbObjItem).fetch()));
+ items.add(read(targetType.getComponentType(), ((DBRef) dbObjItem).fetch(), parent));
} else if (dbObjItem instanceof DBObject) {
- items.add(read(targetType.getComponentType(), (DBObject) dbObjItem));
+ items.add(read(targetType.getComponentType(), (DBObject) dbObjItem, parent));
} else {
TypeInformation> componentType = targetType.getComponentType();
items.add(getPotentiallyConvertedSimpleRead(dbObjItem, componentType == null ? null : componentType.getType()));
@@ -724,7 +730,7 @@ public class MappingMongoConverter extends AbstractMongoConverter implements App
* @return
*/
@SuppressWarnings("unchecked")
- protected Map