From 60d40b51b3d1f8fd6135d4d9d3915d46df494d23 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 14 Dec 2016 13:54:01 +0100 Subject: [PATCH] DATACMNS-957 - AuditingHandler now works with entities without an identifier. Entities without an identifier previously an exception because the IsNewStrategyFactory wasn't able to determine a strategy even if there was no auditing to be applied in the first place. We now eagerly check for auditability and skip the lookup for an IsNewStrategy completely in case that check returns false. Related pull request: #189. --- .../springframework/data/auditing/AuditingHandler.java | 10 ++++++++++ .../data/auditing/IsNewAwareAuditingHandler.java | 2 +- .../auditing/IsNewAwareAuditingHandlerUnitTests.java | 7 +++++++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/auditing/AuditingHandler.java b/src/main/java/org/springframework/data/auditing/AuditingHandler.java index f7433a51e..5210104d9 100644 --- a/src/main/java/org/springframework/data/auditing/AuditingHandler.java +++ b/src/main/java/org/springframework/data/auditing/AuditingHandler.java @@ -134,6 +134,16 @@ public class AuditingHandler implements InitializingBean { touch(source, false); } + /** + * Returns whether the given source is considered to be auditable in the first place + * + * @param source can be {@literal null}. + * @return + */ + protected final boolean isAuditable(Object source) { + return factory.getBeanWrapperFor(source) != null; + } + private void touch(Object target, boolean isNew) { AuditableBeanWrapper wrapper = factory.getBeanWrapperFor(target); diff --git a/src/main/java/org/springframework/data/auditing/IsNewAwareAuditingHandler.java b/src/main/java/org/springframework/data/auditing/IsNewAwareAuditingHandler.java index f9b1d4c59..74922f80b 100644 --- a/src/main/java/org/springframework/data/auditing/IsNewAwareAuditingHandler.java +++ b/src/main/java/org/springframework/data/auditing/IsNewAwareAuditingHandler.java @@ -73,7 +73,7 @@ public class IsNewAwareAuditingHandler extends AuditingHandler { */ public void markAudited(Object object) { - if (object == null) { + if (!isAuditable(object)) { return; } diff --git a/src/test/java/org/springframework/data/auditing/IsNewAwareAuditingHandlerUnitTests.java b/src/test/java/org/springframework/data/auditing/IsNewAwareAuditingHandlerUnitTests.java index d3138ce7f..a1e2d0a76 100644 --- a/src/test/java/org/springframework/data/auditing/IsNewAwareAuditingHandlerUnitTests.java +++ b/src/test/java/org/springframework/data/auditing/IsNewAwareAuditingHandlerUnitTests.java @@ -92,8 +92,15 @@ public class IsNewAwareAuditingHandlerUnitTests extends AuditingHandlerUnitTests handler.markModified(null); } + @Test // DATACMNS-957 + public void skipsEntityWithoutIdentifier() { + getHandler().markAudited(new EntityWithoutId()); + } + static class Domain { @Id Long id; } + + static class EntityWithoutId {} }