Browse Source

DATACMNS-1609, DATACMNS-1461 - Handle null intermediates in setting auditing property paths.

We now catch the MappingException produced by trying to set auditing property paths containing null intermediate segments and ignore those. A less expensive (non-Exception-based) approach is going to be introduced for Moore as it requires API changes to the property path setting APIs.

Related tickets: DATACMNS-1438.
pull/416/head
Oliver Drotbohm 7 years ago committed by Christoph Strobl
parent
commit
c10d0cbe1c
  1. 21
      src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java
  2. 10
      src/test/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactoryUnitTests.java

21
src/main/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactory.java

@ -27,6 +27,7 @@ import org.springframework.data.annotation.CreatedDate; @@ -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 @@ -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 @@ -232,7 +230,20 @@ public class MappingAuditableBeanWrapperFactory extends DefaultAuditableBeanWrap
private <S, P extends PersistentProperty<?>> S setProperty(
PersistentPropertyPaths<?, ? extends PersistentProperty<?>> 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;
}

10
src/test/java/org/springframework/data/auditing/MappingAuditableBeanWrapperFactoryUnitTests.java

@ -212,6 +212,16 @@ public class MappingAuditableBeanWrapperFactoryUnitTests { @@ -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();

Loading…
Cancel
Save