From d8718b46b7e9cb0003ef7ba7934b899dd451412f Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Fri, 31 Oct 2025 07:16:23 +0100 Subject: [PATCH] Partially revert auditing bean registration changes. Restoring bean registration while keeping the optional nature of AuditorAware in the Reactive-/AuditingHandler. The changes done previously caused AOT code generation to fail with: org.springframework.aot.generate.UnsupportedTypeValueCodeGenerationException: Code generation does not support org.springframework.beans.factory.config.AutowiredPropertyMarker See: #3177 --- .../antora/modules/ROOT/pages/auditing.adoc | 5 +- ...uditingBeanDefinitionRegistrarSupport.java | 8 +-- ...anDefinitionRegistrarSupportUnitTests.java | 51 +++++-------------- 3 files changed, 16 insertions(+), 48 deletions(-) diff --git a/src/main/antora/modules/ROOT/pages/auditing.adoc b/src/main/antora/modules/ROOT/pages/auditing.adoc index a15034577..57da96964 100644 --- a/src/main/antora/modules/ROOT/pages/auditing.adoc +++ b/src/main/antora/modules/ROOT/pages/auditing.adoc @@ -3,16 +3,13 @@ [[auditing.basics]] == Basics - -Spring Data provides sophisticated support to transparently keep track of who created or changed an entity and when the change happened. -To benefit from that functionality, you have to equip your entity classes with auditing metadata that can be defined either using annotations or by implementing an interface. +Spring Data provides sophisticated support to transparently keep track of who created or changed an entity and when the change happened.To benefit from that functionality, you have to equip your entity classes with auditing metadata that can be defined either using annotations or by implementing an interface. Additionally, auditing has to be enabled either through Annotation configuration or XML configuration to register the required infrastructure components. Please refer to the store-specific section for configuration samples. [NOTE] ==== Applications that only track creation and modification dates are not required do make their entities implement <>. -If no `AuditorAware` or `DateTimeProvider` bean is configured, `AuditingHandler` will use Spring's autowiring to detect a matching bean if beans of the corresponding type are available in the application context. ==== [[auditing.annotations]] diff --git a/src/main/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupport.java b/src/main/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupport.java index b0f398ac1..a8572dad7 100644 --- a/src/main/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupport.java +++ b/src/main/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupport.java @@ -116,13 +116,12 @@ public abstract class AuditingBeanDefinitionRegistrarSupport implements ImportBe protected BeanDefinitionBuilder configureDefaultAuditHandlerAttributes(AuditingConfiguration configuration, BeanDefinitionBuilder builder) { + builder.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); + if (StringUtils.hasText(configuration.getAuditorAwareRef())) { builder.addPropertyValue(AUDITOR_AWARE, createLazyInitTargetSourceBeanDefinition(configuration.getAuditorAwareRef())); } - else { - builder.addAutowiredProperty(AUDITOR_AWARE); - } builder.addPropertyValue(SET_DATES, configuration.isSetDates()); builder.addPropertyValue(MODIFY_ON_CREATE, configuration.isModifyOnCreate()); @@ -130,9 +129,6 @@ public abstract class AuditingBeanDefinitionRegistrarSupport implements ImportBe if (StringUtils.hasText(configuration.getDateTimeProviderRef())) { builder.addPropertyReference(DATE_TIME_PROVIDER, configuration.getDateTimeProviderRef()); } - else { - builder.addAutowiredProperty(DATE_TIME_PROVIDER); - } builder.setRole(AbstractBeanDefinition.ROLE_INFRASTRUCTURE); diff --git a/src/test/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupportUnitTests.java b/src/test/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupportUnitTests.java index 69879fb37..00180d8e3 100755 --- a/src/test/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupportUnitTests.java +++ b/src/test/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupportUnitTests.java @@ -20,23 +20,19 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.lang.annotation.Annotation; -import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.beans.factory.config.AutowiredPropertyMarker; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.AbstractBeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.BeanDefinitionRegistry; -import org.springframework.context.support.GenericApplicationContext; import org.springframework.core.type.AnnotationMetadata; import org.springframework.data.auditing.AuditingHandler; import org.springframework.data.auditing.EnableAuditing; -import org.springframework.data.mapping.context.PersistentEntities; /** * Unit tests for {@link AuditingBeanDefinitionRegistrarSupport}. @@ -46,7 +42,6 @@ import org.springframework.data.mapping.context.PersistentEntities; * @author Oliver Gierke * @author Francisco Soler * @author Jaeyeon Kim - * @author Mark Paluch */ @ExtendWith(MockitoExtension.class) class AuditingBeanDefinitionRegistrarSupportUnitTests { @@ -82,28 +77,13 @@ class AuditingBeanDefinitionRegistrarSupportUnitTests { .isThrownBy(() -> registrar.registerBeanDefinitions(metadata, null)); } - @Test // GH-3177 + @Test // DATACMNS-3177 void setsAuditorAwareAndDateTimeProviderIfConfigured() { - AuditingConfiguration configuration = new DummyAuditingBeanDefinitionRegistrarSupport().getConfiguration(null); - - BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(AuditingHandler.class); - DummyAuditingBeanDefinitionRegistrarSupport registrar = new DummyAuditingBeanDefinitionRegistrarSupport(); - - BeanDefinitionBuilder result = registrar.configureDefaultAuditHandlerAttributes(configuration, builder); - AbstractBeanDefinition beanDefinition = result.getBeanDefinition(); - - assertThat(beanDefinition.getPropertyValues().contains("auditorAware")).isTrue(); - assertThat(beanDefinition.getPropertyValues().contains("dateTimeProvider")).isTrue(); - } - - @Test // GH-3177 - void doesNotSetAuditorAwareAndDateTimeProviderIfNotConfigured() { - AuditingConfiguration configuration = new AuditingConfiguration() { @Override public String getAuditorAwareRef() { - return ""; + return "auditorAwareBean"; } @Override @@ -113,7 +93,7 @@ class AuditingBeanDefinitionRegistrarSupportUnitTests { @Override public String getDateTimeProviderRef() { - return ""; + return "dateTimeProviderBean"; } @Override @@ -128,12 +108,13 @@ class AuditingBeanDefinitionRegistrarSupportUnitTests { BeanDefinitionBuilder result = registrar.configureDefaultAuditHandlerAttributes(configuration, builder); AbstractBeanDefinition beanDefinition = result.getBeanDefinition(); - assertThat(beanDefinition.getPropertyValues().get("auditorAware")).isEqualTo(AutowiredPropertyMarker.INSTANCE); - assertThat(beanDefinition.getPropertyValues().get("dateTimeProvider")).isEqualTo(AutowiredPropertyMarker.INSTANCE); + assertThat(beanDefinition.getAutowireMode()).isEqualTo(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); + assertThat(beanDefinition.getPropertyValues().contains("auditorAware")).isTrue(); + assertThat(beanDefinition.getPropertyValues().contains("dateTimeProvider")).isTrue(); } - @Test // GH-3177 - void optionalAutowiringShouldConsiderOptionalProperties() { + @Test // DATACMNS-3177 + void doesNotSetAuditorAwareAndDateTimeProviderIfNotConfigured() { AuditingConfiguration configuration = new AuditingConfiguration() { @Override @@ -152,24 +133,18 @@ class AuditingBeanDefinitionRegistrarSupportUnitTests { } @Override - public boolean isModifyOnCreate() { - return true; - } + public boolean isModifyOnCreate() { return true; } }; BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(AuditingHandler.class); - builder.addConstructorArgValue(PersistentEntities.of()); DummyAuditingBeanDefinitionRegistrarSupport registrar = new DummyAuditingBeanDefinitionRegistrarSupport(); BeanDefinitionBuilder result = registrar.configureDefaultAuditHandlerAttributes(configuration, builder); + AbstractBeanDefinition beanDefinition = result.getBeanDefinition(); - GenericApplicationContext context = new GenericApplicationContext(); - context.registerBeanDefinition("auditingHandler", result.getBeanDefinition()); - context.refresh(); - - AuditingHandler handler = context.getBean(AuditingHandler.class); - - assertThat(handler).extracting("auditorAware").isEqualTo(Optional.empty()); + assertThat(beanDefinition.getAutowireMode()).isEqualTo(AbstractBeanDefinition.AUTOWIRE_BY_TYPE); + assertThat(beanDefinition.getPropertyValues().contains("auditorAware")).isFalse(); + assertThat(beanDefinition.getPropertyValues().contains("dateTimeProvider")).isFalse(); } static class SampleConfig {}