17
17
18
18
import java .lang .annotation .Annotation ;
19
19
20
+ import org .springframework .beans .factory .ListableBeanFactory ;
20
21
import org .springframework .beans .factory .config .BeanDefinition ;
21
- import org .springframework .beans .factory .support .AbstractBeanDefinition ;
22
22
import org .springframework .beans .factory .support .BeanDefinitionBuilder ;
23
+ import org .springframework .beans .factory .support .BeanDefinitionReaderUtils ;
23
24
import org .springframework .beans .factory .support .BeanDefinitionRegistry ;
24
25
import org .springframework .context .annotation .ImportBeanDefinitionRegistrar ;
25
26
import org .springframework .data .auditing .ReactiveIsNewAwareAuditingHandler ;
26
27
import org .springframework .data .auditing .config .AuditingBeanDefinitionRegistrarSupport ;
27
28
import org .springframework .data .auditing .config .AuditingConfiguration ;
28
29
import org .springframework .data .config .ParsingUtils ;
30
+ import org .springframework .data .mapping .context .PersistentEntities ;
29
31
import org .springframework .data .r2dbc .mapping .event .ReactiveAuditingEntityCallback ;
32
+ import org .springframework .lang .Nullable ;
30
33
import org .springframework .util .Assert ;
31
34
32
35
/**
33
36
* {@link ImportBeanDefinitionRegistrar} to enable {@link EnableR2dbcAuditing} annotation.
34
37
*
35
38
* @author Mark Paluch
39
+ * @author Christoph Strobl
36
40
* @since 1.2
37
41
*/
38
42
class R2dbcAuditingRegistrar extends AuditingBeanDefinitionRegistrarSupport {
@@ -55,6 +59,12 @@ protected String getAuditingHandlerBeanName() {
55
59
return "r2dbcAuditingHandler" ;
56
60
}
57
61
62
+ @ Override
63
+ protected void postProcess (BeanDefinitionBuilder builder , AuditingConfiguration configuration ,
64
+ BeanDefinitionRegistry registry ) {
65
+ potentiallyRegisterR2dbcPersistentEntities (builder , registry );
66
+ }
67
+
58
68
/*
59
69
* (non-Javadoc)
60
70
* @see org.springframework.data.auditing.config.AuditingBeanDefinitionRegistrarSupport#getAuditHandlerBeanDefinitionBuilder(org.springframework.data.auditing.config.AuditingConfiguration)
@@ -64,13 +74,8 @@ protected BeanDefinitionBuilder getAuditHandlerBeanDefinitionBuilder(AuditingCon
64
74
65
75
Assert .notNull (configuration , "AuditingConfiguration must not be null" );
66
76
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 ));
74
79
}
75
80
76
81
/*
@@ -84,13 +89,47 @@ protected void registerAuditListenerBeanDefinition(BeanDefinition auditingHandle
84
89
Assert .notNull (auditingHandlerDefinition , "BeanDefinition must not be null" );
85
90
Assert .notNull (registry , "BeanDefinitionRegistry must not be null" );
86
91
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 ) {
88
123
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
+ }
91
131
92
- registerInfrastructureBeanWithId (builder .getBeanDefinition (), ReactiveAuditingEntityCallback .class .getName (),
93
- registry );
132
+ return null ;
94
133
}
95
134
96
135
}
0 commit comments