diff --git a/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java b/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java index 7e4c7b344..81e65d09c 100644 --- a/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java +++ b/src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java @@ -27,6 +27,7 @@ import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedBy; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.domain.Auditable; +import org.springframework.data.mapping.MappingException; import org.springframework.data.mapping.PersistentEntity; import org.springframework.data.mapping.PersistentProperty; import org.springframework.data.mapping.PersistentPropertyAccessor; @@ -174,10 +175,7 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap */ @Override public Object setCreatedBy(Object value) { - - metadata.createdByPaths.forEach(it -> this.accessor.setProperty(it, value)); - - return value; + return setProperty(metadata.createdByPaths, value); } /* @@ -232,7 +230,20 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap private > S setProperty( PersistentPropertyPaths> paths, S value) { - paths.forEach(it -> this.accessor.setProperty(it, value)); + paths.forEach(it -> { + + try { + + this.accessor.setProperty(it, value); + + } catch (MappingException o_O) { + + // Ignore null intermediate errors temporarily + if (!o_O.getMessage().contains("on null intermediate")) { + throw o_O; + } + } + }); return value; } diff --git a/src/test/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactoryUnitTests.java b/src/test/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactoryUnitTests.java index 14dc8bb36..e1564ce02 100755 --- a/src/test/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactoryUnitTests.java +++ b/src/test/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactoryUnitTests.java @@ -212,6 +212,16 @@ public class MappingAuditableBeanWrapperFactoryUnitTests { }); } + @Test // DATACMNS-1461 + public void skipsNullIntermediatesWhenSettingProperties() { + + WithEmbedded withEmbedded = new WithEmbedded(); + + assertThat(factory.getBeanWrapperFor(withEmbedded)).hasValueSatisfying(it -> { + assertThatCode(() -> it.setCreatedBy("user")).doesNotThrowAnyException(); + }); + } + private void assertLastModificationDate(Object source, TemporalAccessor expected) { Sample sample = new Sample();