@@ -331,7 +331,7 @@ private <R> R doReadProjection(ConversionContext context, Bson bson, EntityProje
331331 PersistentPropertyAccessor <?> convertingAccessor = PropertyTranslatingPropertyAccessor
332332 .create (new ConvertingPropertyAccessor <>(accessor , conversionService ), propertyTranslator );
333333 MongoDbPropertyValueProvider valueProvider = new MongoDbPropertyValueProvider (context , documentAccessor ,
334- evaluator );
334+ evaluator , spELContext );
335335
336336 readProperties (context , entity , convertingAccessor , documentAccessor , valueProvider , evaluator ,
337337 Predicates .isTrue ());
@@ -367,7 +367,7 @@ String getFieldName(MongoPersistentProperty prop) {
367367 populateProperties (context , mappedEntity , documentAccessor , evaluator , instance );
368368
369369 PersistentPropertyAccessor <?> convertingAccessor = new ConvertingPropertyAccessor <>(accessor , conversionService );
370- MongoDbPropertyValueProvider valueProvider = new MongoDbPropertyValueProvider (context , documentAccessor , evaluator );
370+ MongoDbPropertyValueProvider valueProvider = new MongoDbPropertyValueProvider (context , documentAccessor , evaluator , spELContext );
371371
372372 readProperties (context , mappedEntity , convertingAccessor , documentAccessor , valueProvider , evaluator ,
373373 Predicates .isTrue ());
@@ -529,7 +529,7 @@ private <S> S populateProperties(ConversionContext context, MongoPersistentEntit
529529 ConversionContext contextToUse = context .withPath (currentPath );
530530
531531 MongoDbPropertyValueProvider valueProvider = new MongoDbPropertyValueProvider (contextToUse , documentAccessor ,
532- evaluator );
532+ evaluator , spELContext );
533533
534534 Predicate <MongoPersistentProperty > propertyFilter = isIdentifier (entity ).or (isConstructorArgument (entity )).negate ();
535535 readProperties (contextToUse , entity , accessor , documentAccessor , valueProvider , evaluator , propertyFilter );
@@ -868,9 +868,9 @@ private void writeProperties(Bson bson, MongoPersistentEntity<?> entity, Persist
868868 dbObjectAccessor .put (prop , null );
869869 }
870870 } else if (!conversions .isSimpleType (value .getClass ())) {
871- writePropertyInternal (value , dbObjectAccessor , prop );
871+ writePropertyInternal (value , dbObjectAccessor , prop , accessor );
872872 } else {
873- writeSimpleInternal (value , bson , prop );
873+ writeSimpleInternal (value , bson , prop , accessor );
874874 }
875875 }
876876 }
@@ -887,11 +887,11 @@ private void writeAssociation(Association<MongoPersistentProperty> association,
887887 return ;
888888 }
889889
890- writePropertyInternal (value , dbObjectAccessor , inverseProp );
890+ writePropertyInternal (value , dbObjectAccessor , inverseProp , accessor );
891891 }
892892
893893 @ SuppressWarnings ({ "unchecked" })
894- protected void writePropertyInternal (@ Nullable Object obj , DocumentAccessor accessor , MongoPersistentProperty prop ) {
894+ protected void writePropertyInternal (@ Nullable Object obj , DocumentAccessor accessor , MongoPersistentProperty prop , PersistentPropertyAccessor <?> persistentPropertyAccessor ) {
895895
896896 if (obj == null ) {
897897 return ;
@@ -902,7 +902,13 @@ protected void writePropertyInternal(@Nullable Object obj, DocumentAccessor acce
902902
903903 if (conversions .hasValueConverter (prop )) {
904904 accessor .put (prop , conversions .getPropertyValueConversions ().getValueConverter (prop ).write (obj ,
905- new MongoConversionContext (prop , this )));
905+ new MongoConversionContext (new PropertyValueProvider <MongoPersistentProperty >() {
906+ @ Nullable
907+ @ Override
908+ public <T > T getPropertyValue (MongoPersistentProperty property ) {
909+ return (T ) persistentPropertyAccessor .getProperty (property );
910+ }
911+ }, prop , this , spELContext )));
906912 return ;
907913 }
908914
@@ -1234,12 +1240,18 @@ private void writeSimpleInternal(@Nullable Object value, Bson bson, String key)
12341240 BsonUtils .addToMap (bson , key , getPotentiallyConvertedSimpleWrite (value , Object .class ));
12351241 }
12361242
1237- private void writeSimpleInternal (@ Nullable Object value , Bson bson , MongoPersistentProperty property ) {
1243+ private void writeSimpleInternal (@ Nullable Object value , Bson bson , MongoPersistentProperty property , PersistentPropertyAccessor <?> persistentPropertyAccessor ) {
12381244 DocumentAccessor accessor = new DocumentAccessor (bson );
12391245
12401246 if (conversions .hasValueConverter (property )) {
12411247 accessor .put (property , conversions .getPropertyValueConversions ().getValueConverter (property ).write (value ,
1242- new MongoConversionContext (property , this )));
1248+ new MongoConversionContext (new PropertyValueProvider <MongoPersistentProperty >() {
1249+ @ Nullable
1250+ @ Override
1251+ public <T > T getPropertyValue (MongoPersistentProperty property ) {
1252+ return (T ) persistentPropertyAccessor .getProperty (property );
1253+ }
1254+ }, property , this , spELContext )));
12431255 return ;
12441256 }
12451257
@@ -1845,6 +1857,7 @@ static class MongoDbPropertyValueProvider implements PropertyValueProvider<Mongo
18451857 final ConversionContext context ;
18461858 final DocumentAccessor accessor ;
18471859 final SpELExpressionEvaluator evaluator ;
1860+ final SpELContext spELContext ;
18481861
18491862 /**
18501863 * Creates a new {@link MongoDbPropertyValueProvider} for the given source, {@link SpELExpressionEvaluator} and
@@ -1855,7 +1868,7 @@ static class MongoDbPropertyValueProvider implements PropertyValueProvider<Mongo
18551868 * @param evaluator must not be {@literal null}.
18561869 */
18571870 MongoDbPropertyValueProvider (ConversionContext context , Bson source , SpELExpressionEvaluator evaluator ) {
1858- this (context , new DocumentAccessor (source ), evaluator );
1871+ this (context , new DocumentAccessor (source ), evaluator , null );
18591872 }
18601873
18611874 /**
@@ -1867,7 +1880,7 @@ static class MongoDbPropertyValueProvider implements PropertyValueProvider<Mongo
18671880 * @param evaluator must not be {@literal null}.
18681881 */
18691882 MongoDbPropertyValueProvider (ConversionContext context , DocumentAccessor accessor ,
1870- SpELExpressionEvaluator evaluator ) {
1883+ SpELExpressionEvaluator evaluator , SpELContext spELContext ) {
18711884
18721885 Assert .notNull (context , "ConversionContext must no be null" );
18731886 Assert .notNull (accessor , "DocumentAccessor must no be null" );
@@ -1876,6 +1889,7 @@ static class MongoDbPropertyValueProvider implements PropertyValueProvider<Mongo
18761889 this .context = context ;
18771890 this .accessor = accessor ;
18781891 this .evaluator = evaluator ;
1892+ this .spELContext = spELContext ;
18791893 }
18801894
18811895 @ Nullable
@@ -1892,7 +1906,7 @@ public <T> T getPropertyValue(MongoPersistentProperty property) {
18921906 CustomConversions conversions = context .getCustomConversions ();
18931907 if (conversions .hasValueConverter (property )) {
18941908 return (T ) conversions .getPropertyValueConversions ().getValueConverter (property ).read (value ,
1895- new MongoConversionContext (property , context .getSourceConverter ()));
1909+ new MongoConversionContext (this , property , context .getSourceConverter (), spELContext ));
18961910 }
18971911
18981912 ConversionContext contextToUse = context .forProperty (property );
@@ -1902,7 +1916,7 @@ public <T> T getPropertyValue(MongoPersistentProperty property) {
19021916
19031917 public MongoDbPropertyValueProvider withContext (ConversionContext context ) {
19041918
1905- return context == this .context ? this : new MongoDbPropertyValueProvider (context , accessor , evaluator );
1919+ return context == this .context ? this : new MongoDbPropertyValueProvider (context , accessor , evaluator , spELContext );
19061920 }
19071921 }
19081922
@@ -1925,7 +1939,7 @@ class AssociationAwareMongoDbPropertyValueProvider extends MongoDbPropertyValueP
19251939 */
19261940 AssociationAwareMongoDbPropertyValueProvider (ConversionContext context , DocumentAccessor source ,
19271941 SpELExpressionEvaluator evaluator ) {
1928- super (context , source , evaluator );
1942+ super (context , source , evaluator , MappingMongoConverter . this . spELContext );
19291943 }
19301944
19311945 @ Override
0 commit comments