From b7a9b09b7cc8a4aebdf3e86c332a29afd04b3d27 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 10 Oct 2017 16:35:44 +0200 Subject: [PATCH] DATACMNS-901 - AbstractMappingContext publishes entity added events outside the write lock. Previously, the publication of the event that indicated a PersistentEntity having been added to it took place before the write lock over the entities had been released. We now keep the lock smaller and publish the addition event *after* the lock has been released. --- .../mapping/context/AbstractMappingContext.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java b/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java index 274ebb8ed..2cc249242 100644 --- a/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java +++ b/src/main/java/org/springframework/data/mapping/context/AbstractMappingContext.java @@ -306,12 +306,13 @@ public abstract class AbstractMappingContext type = typeInformation.getType(); + E entity = null; try { write.lock(); - final E entity = createPersistentEntity(typeInformation); + entity = createPersistentEntity(typeInformation); // Eagerly cache the entity as we might have to find it during recursive lookups. persistentEntities.put(typeInformation, entity); @@ -340,18 +341,18 @@ public abstract class AbstractMappingContext(this, entity)); - } - - return entity; - } catch (BeansException e) { throw new MappingException(e.getMessage(), e); } finally { write.unlock(); } + + // Inform listeners + if (applicationEventPublisher != null && entity != null) { + applicationEventPublisher.publishEvent(new MappingContextEvent(this, entity)); + } + + return entity; } /*