1717
1818import java .lang .annotation .Annotation ;
1919
20+ import org .springframework .beans .factory .ListableBeanFactory ;
2021import org .springframework .beans .factory .config .BeanDefinition ;
21- import org .springframework .beans .factory .support .AbstractBeanDefinition ;
2222import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
23+ import org .springframework .beans .factory .support .BeanDefinitionReaderUtils ;
2324import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
2425import org .springframework .context .annotation .ImportBeanDefinitionRegistrar ;
2526import org .springframework .data .auditing .ReactiveIsNewAwareAuditingHandler ;
2627import org .springframework .data .auditing .config .AuditingBeanDefinitionRegistrarSupport ;
2728import org .springframework .data .auditing .config .AuditingConfiguration ;
2829import org .springframework .data .config .ParsingUtils ;
30+ import org .springframework .data .mapping .context .PersistentEntities ;
2931import org .springframework .data .r2dbc .mapping .event .ReactiveAuditingEntityCallback ;
32+ import org .springframework .lang .Nullable ;
3033import org .springframework .util .Assert ;
3134
3235/**
3336 * {@link ImportBeanDefinitionRegistrar} to enable {@link EnableR2dbcAuditing} annotation.
3437 *
3538 * @author Mark Paluch
39+ * @author Christoph Strobl
3640 * @since 1.2
3741 */
3842class R2dbcAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
@@ -55,6 +59,12 @@ protected String getAuditingHandlerBeanName() {
5559 return "r2dbcAuditingHandler" ;
5660 }
5761
62+ @ Override
63+ protected void postProcess (BeanDefinitionBuilder builder , AuditingConfiguration configuration ,
64+ BeanDefinitionRegistry registry ) {
65+ potentiallyRegisterR2dbcPersistentEntities (builder , registry );
66+ }
67+
5868 /*
5969 * (non-Javadoc)
6070 * @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAuditHandlerBeanDefinitionBuilder(org.springframework.data.auditing.config.AuditingConfiguration)
@@ -64,13 +74,8 @@ protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingCon
6474
6575 Assert .notNull (configuration , "AuditingConfiguration must not be null" );
6676
67- BeanDefinitionBuilder builder = BeanDefinitionBuilder .rootBeanDefinition (ReactiveIsNewAwareAuditingHandler .class );
68-
69- BeanDefinitionBuilder definition = BeanDefinitionBuilder .genericBeanDefinition (PersistentEntitiesFactoryBean .class );
70- definition .setAutowireMode (AbstractBeanDefinition .AUTOWIRE_CONSTRUCTOR );
71-
72- builder .addConstructorArgValue (definition .getBeanDefinition ());
73- return configureDefaultAuditHandlerAttributes (configuration , builder );
77+ return configureDefaultAuditHandlerAttributes (configuration ,
78+ BeanDefinitionBuilder .rootBeanDefinition (ReactiveIsNewAwareAuditingHandler .class ));
7479 }
7580
7681 /*
@@ -84,13 +89,47 @@ protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandle
8489 Assert .notNull (auditingHandlerDefinition , "BeanDefinition must not be null" );
8590 Assert .notNull (registry , "BeanDefinitionRegistry must not be null" );
8691
87- BeanDefinitionBuilder builder = BeanDefinitionBuilder .rootBeanDefinition (ReactiveAuditingEntityCallback .class );
92+ BeanDefinitionBuilder listenerBeanDefinitionBuilder = BeanDefinitionBuilder
93+ .rootBeanDefinition (ReactiveAuditingEntityCallback .class );
94+ listenerBeanDefinitionBuilder
95+ .addConstructorArgValue (ParsingUtils .getObjectFactoryBeanDefinition (getAuditingHandlerBeanName (), registry ));
96+
97+ registerInfrastructureBeanWithId (listenerBeanDefinitionBuilder .getBeanDefinition (),
98+ ReactiveAuditingEntityCallback .class .getName (), registry );
99+ }
100+
101+ static void potentiallyRegisterR2dbcPersistentEntities (BeanDefinitionBuilder builder ,
102+ BeanDefinitionRegistry registry ) {
103+
104+ String persistentEntitiesBeanName = R2dbcAuditingRegistrar .detectPersistentEntitiesBeanName (registry );
105+
106+ if (persistentEntitiesBeanName == null ) {
107+
108+ persistentEntitiesBeanName = BeanDefinitionReaderUtils .uniqueBeanName ("r2dbcPersistentEntities" , registry );
109+
110+ // TODO: https://github.com/spring-projects/spring-framework/issues/28728
111+ BeanDefinitionBuilder definition = BeanDefinitionBuilder .genericBeanDefinition (PersistentEntities .class ) //
112+ .setFactoryMethod ("of" ) //
113+ .addConstructorArgReference ("r2dbcMappingContext" );
114+
115+ registry .registerBeanDefinition (persistentEntitiesBeanName , definition .getBeanDefinition ());
116+ }
117+
118+ builder .addConstructorArgReference (persistentEntitiesBeanName );
119+ }
120+
121+ @ Nullable
122+ private static String detectPersistentEntitiesBeanName (BeanDefinitionRegistry registry ) {
88123
89- builder .addConstructorArgValue (ParsingUtils .getObjectFactoryBeanDefinition (getAuditingHandlerBeanName (), registry ));
90- builder .getRawBeanDefinition ().setSource (auditingHandlerDefinition .getSource ());
124+ if (registry instanceof ListableBeanFactory beanFactory ) {
125+ for (String bn : beanFactory .getBeanNamesForType (PersistentEntities .class )) {
126+ if (bn .startsWith ("r2dbc" )) {
127+ return bn ;
128+ }
129+ }
130+ }
91131
92- registerInfrastructureBeanWithId (builder .getBeanDefinition (), ReactiveAuditingEntityCallback .class .getName (),
93- registry );
132+ return null ;
94133 }
95134
96135}
0 commit comments