Browse Source

Apply unwrapped persistent property equality check to delegate.

We now compare the other object whether it equals the delegate in case UnwrappedMongoPersistentProperty.equals is being called with the MongoPersistentProperty retrieved from a MappingContext.

This ensures that unwrapped properties can be compared to vanilla MongoPersistentProperty instances when checking constructor/creator method correlation of parameters.

Closes #4732
pull/4743/head
Mark Paluch 1 year ago
parent
commit
1545e184ef
No known key found for this signature in database
GPG Key ID: 55BC6374BAA9D973
  1. 4
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/UnwrappedMongoPersistentProperty.java
  2. 31
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallbackUnitTests.java

4
spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/mapping/UnwrappedMongoPersistentProperty.java

@ -362,6 +362,10 @@ class UnwrappedMongoPersistentProperty implements MongoPersistentProperty {
return true; return true;
} }
if (obj == delegate) {
return true;
}
if (obj == null || getClass() != obj.getClass()) { if (obj == null || getClass() != obj.getClass()) {
return false; return false;
} }

31
spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/mapping/event/AuditingEntityCallbackUnitTests.java

@ -34,6 +34,7 @@ import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.auditing.IsNewAwareAuditingHandler; import org.springframework.data.auditing.IsNewAwareAuditingHandler;
import org.springframework.data.mapping.context.PersistentEntities; import org.springframework.data.mapping.context.PersistentEntities;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext; import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import org.springframework.data.mongodb.core.mapping.Unwrapped;
/** /**
* Unit tests for {@link AuditingEntityCallback}. * Unit tests for {@link AuditingEntityCallback}.
@ -43,13 +44,14 @@ import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
@ExtendWith(MockitoExtension.class) @ExtendWith(MockitoExtension.class)
public class AuditingEntityCallbackUnitTests { public class AuditingEntityCallbackUnitTests {
private final MongoMappingContext mappingContext = new MongoMappingContext();
private IsNewAwareAuditingHandler handler; private IsNewAwareAuditingHandler handler;
private AuditingEntityCallback callback; private AuditingEntityCallback callback;
@BeforeEach @BeforeEach
void setUp() { void setUp() {
MongoMappingContext mappingContext = new MongoMappingContext();
mappingContext.getPersistentEntity(Sample.class); mappingContext.getPersistentEntity(Sample.class);
handler = spy(new IsNewAwareAuditingHandler(new PersistentEntities(Arrays.asList(mappingContext)))); handler = spy(new IsNewAwareAuditingHandler(new PersistentEntities(Arrays.asList(mappingContext))));
@ -105,6 +107,21 @@ public class AuditingEntityCallbackUnitTests {
assertThat(result).isSameAs(newSample); assertThat(result).isSameAs(newSample);
} }
@Test // GH-4732
void shouldApplyAuditingToUnwrappedImmutableObject() {
WithUnwrapped sample = new WithUnwrapped();
sample.auditingData = new MyAuditingData(null, null);
IsNewAwareAuditingHandler handler = new IsNewAwareAuditingHandler(PersistentEntities.of(mappingContext));
AuditingEntityCallback listener = new AuditingEntityCallback(() -> handler);
WithUnwrapped result = (WithUnwrapped) listener.onBeforeConvert(sample, "foo");
assertThat(result.auditingData.created).isNotNull();
assertThat(result.auditingData.modified).isNotNull();
}
static class Sample { static class Sample {
@Id String id; @Id String id;
@ -112,6 +129,18 @@ public class AuditingEntityCallbackUnitTests {
@LastModifiedDate Date modified; @LastModifiedDate Date modified;
} }
static class WithUnwrapped {
@Id String id;
@Unwrapped(onEmpty = Unwrapped.OnEmpty.USE_NULL) MyAuditingData auditingData;
}
record MyAuditingData(@CreatedDate Date created, @LastModifiedDate Date modified) {
}
private static final class ImmutableSample { private static final class ImmutableSample {
@Id private final String id; @Id private final String id;

Loading…
Cancel
Save