Skip to content

Commit 5b6e525

Browse files
committed
DATAJPA-1448 - Properly avoid double registration of AnnotationBeanConfigurerAspect.
Previously we used the aspect's class name to guard the registration of a AnnotationBeanConfigurerAspect bean but eventually ended up registering it under the globally used name (org.springframework.context.config.internalBeanConfigurerAspect). That caused our bean being registered even if there already was one in the context causing the original bean to be overridden. The latter is now disabled by default in Spring Boot 2.1 so that it causes applications failing to start. We now properly check for the correct bean name to guard the registration.
1 parent b339217 commit 5b6e525

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

src/main/java/org/springframework/data/jpa/repository/config/JpaAuditingRegistrar.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandle
116116
*/
117117
private void registerBeanConfigurerAspectIfNecessary(BeanDefinitionRegistry registry) {
118118

119-
if (registry.containsBeanDefinition(BEAN_CONFIGURER_ASPECT_CLASS_NAME)) {
119+
if (registry.containsBeanDefinition(BEAN_CONFIGURER_ASPECT_BEAN_NAME)) {
120120
return;
121121
}
122122

src/test/java/org/springframework/data/jpa/repository/config/JpaAuditingRegistrarUnitTests.java

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,18 @@
1515
*/
1616
package org.springframework.data.jpa.repository.config;
1717

18+
import static org.mockito.ArgumentMatchers.*;
19+
import static org.mockito.Mockito.*;
20+
1821
import org.junit.Test;
1922
import org.junit.runner.RunWith;
2023
import org.mockito.Mock;
2124
import org.mockito.runners.MockitoJUnitRunner;
2225
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
2326
import org.springframework.core.type.AnnotationMetadata;
27+
import org.springframework.core.type.classreading.MetadataReader;
28+
import org.springframework.core.type.classreading.SimpleMetadataReaderFactory;
29+
import org.springframework.data.jpa.domain.support.AuditingBeanFactoryPostProcessor;
2430

2531
/**
2632
* Unit tests for {@link JpaAuditingRegistrar}.
@@ -44,4 +50,27 @@ public void rejectsNullAnnotationMetadata() {
4450
public void rejectsNullBeanDefinitionRegistry() {
4551
registrar.registerBeanDefinitions(metadata, null);
4652
}
53+
54+
@Test // DATAJPA-1448
55+
public void doesNotRegisterBeanConfigurerTwice() throws Exception {
56+
57+
SimpleMetadataReaderFactory factory = new SimpleMetadataReaderFactory();
58+
MetadataReader reader = factory.getMetadataReader(Sample.class.getName());
59+
AnnotationMetadata annotationMetadata = reader.getAnnotationMetadata();
60+
61+
// Given a bean already present
62+
String beanName = AuditingBeanFactoryPostProcessor.BEAN_CONFIGURER_ASPECT_BEAN_NAME;
63+
when(registry.containsBeanDefinition(beanName)).thenReturn(true);
64+
65+
// When invoking configuration
66+
registrar.registerBeanDefinitions(annotationMetadata, registry);
67+
68+
// Then the bean is not registered again
69+
verify(registry, times(0)).registerBeanDefinition(eq(beanName), any());
70+
71+
registrar.registerBeanDefinitions(annotationMetadata, registry);
72+
}
73+
74+
@EnableJpaAuditing
75+
static class Sample {}
4776
}

0 commit comments

Comments
 (0)