Browse Source

Allow autowiring of `DateTimeProvider` for `AuditingHandler`.

Use autowired properties for AuditorAware and DateTimeProvider when explicit references are not provided

Closes: #3177
Original pull request: #3385

Signed-off-by: JaeYeon Kim <ghgh415263@naver.com>
pull/3394/head
JaeYeon Kim 2 months ago committed by Mark Paluch
parent
commit
038eae67ea
No known key found for this signature in database
GPG Key ID: 55BC6374BAA9D973
  1. 9
      src/main/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupport.java
  2. 74
      src/test/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupportUnitTests.java

9
src/main/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupport.java

@ -21,7 +21,6 @@ import java.lang.annotation.Annotation; @@ -21,7 +21,6 @@ import java.lang.annotation.Annotation;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.aop.target.LazyInitTargetSource;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
@ -29,7 +28,6 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry; @@ -29,7 +28,6 @@ import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.data.auditing.AuditingHandler;
import org.springframework.data.auditing.CurrentDateTimeProvider;
import org.springframework.util.Assert;
import org.springframework.util.StringUtils;
@ -42,6 +40,7 @@ import org.springframework.util.StringUtils; @@ -42,6 +40,7 @@ import org.springframework.util.StringUtils;
* @author Thomas Darimont
* @author Oliver Gierke
* @author Francisco Soler
* @author Jaeyeon Kim
*/
public abstract class AuditingBeanDefinitionRegistrarSupport implements ImportBeanDefinitionRegistrar {
@ -117,11 +116,11 @@ public abstract class AuditingBeanDefinitionRegistrarSupport implements ImportBe @@ -117,11 +116,11 @@ 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.setAutowireMode(AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE);
}
builder.addPropertyValue(SET_DATES, configuration.isSetDates());
@ -129,8 +128,6 @@ public abstract class AuditingBeanDefinitionRegistrarSupport implements ImportBe @@ -129,8 +128,6 @@ public abstract class AuditingBeanDefinitionRegistrarSupport implements ImportBe
if (StringUtils.hasText(configuration.getDateTimeProviderRef())) {
builder.addPropertyReference(DATE_TIME_PROVIDER, configuration.getDateTimeProviderRef());
} else {
builder.addPropertyValue(DATE_TIME_PROVIDER, CurrentDateTimeProvider.INSTANCE);
}
builder.setRole(AbstractBeanDefinition.ROLE_INFRASTRUCTURE);

74
src/test/java/org/springframework/data/auditing/config/AuditingBeanDefinitionRegistrarSupportUnitTests.java

@ -27,8 +27,11 @@ import org.mockito.Mock; @@ -27,8 +27,11 @@ import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
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.core.type.AnnotationMetadata;
import org.springframework.data.auditing.AuditingHandler;
import org.springframework.data.auditing.EnableAuditing;
/**
@ -38,6 +41,7 @@ import org.springframework.data.auditing.EnableAuditing; @@ -38,6 +41,7 @@ import org.springframework.data.auditing.EnableAuditing;
* @author Thomas Darimont
* @author Oliver Gierke
* @author Francisco Soler
* @author Jaeyeon Kim
*/
@ExtendWith(MockitoExtension.class)
class AuditingBeanDefinitionRegistrarSupportUnitTests {
@ -73,6 +77,76 @@ class AuditingBeanDefinitionRegistrarSupportUnitTests { @@ -73,6 +77,76 @@ class AuditingBeanDefinitionRegistrarSupportUnitTests {
.isThrownBy(() -> registrar.registerBeanDefinitions(metadata, null));
}
@Test // DATACMNS-3177
void setsAuditorAwareAndDateTimeProviderIfConfigured() {
AuditingConfiguration configuration = new AuditingConfiguration() {
@Override
public String getAuditorAwareRef() {
return "auditorAwareBean";
}
@Override
public boolean isSetDates() {
return true;
}
@Override
public String getDateTimeProviderRef() {
return "dateTimeProviderBean";
}
@Override
public boolean isModifyOnCreate() {
return true;
}
};
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(AuditingHandler.class);
DummyAuditingBeanDefinitionRegistrarSupport registrar = new DummyAuditingBeanDefinitionRegistrarSupport();
BeanDefinitionBuilder result = registrar.configureDefaultAuditHandlerAttributes(configuration, builder);
AbstractBeanDefinition beanDefinition = result.getBeanDefinition();
assertThat(beanDefinition.getAutowireMode()).isEqualTo(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
assertThat(beanDefinition.getPropertyValues().contains("auditorAware")).isTrue();
assertThat(beanDefinition.getPropertyValues().contains("dateTimeProvider")).isTrue();
}
@Test // DATACMNS-3177
void doesNotSetAuditorAwareAndDateTimeProviderIfNotConfigured() {
AuditingConfiguration configuration = new AuditingConfiguration() {
@Override
public String getAuditorAwareRef() {
return "";
}
@Override
public boolean isSetDates() {
return true;
}
@Override
public String getDateTimeProviderRef() {
return "";
}
@Override
public boolean isModifyOnCreate() { return true; }
};
BeanDefinitionBuilder builder = BeanDefinitionBuilder.rootBeanDefinition(AuditingHandler.class);
DummyAuditingBeanDefinitionRegistrarSupport registrar = new DummyAuditingBeanDefinitionRegistrarSupport();
BeanDefinitionBuilder result = registrar.configureDefaultAuditHandlerAttributes(configuration, builder);
AbstractBeanDefinition beanDefinition = result.getBeanDefinition();
assertThat(beanDefinition.getAutowireMode()).isEqualTo(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);
assertThat(beanDefinition.getPropertyValues().contains("auditorAware")).isFalse();
assertThat(beanDefinition.getPropertyValues().contains("dateTimeProvider")).isFalse();
}
static class SampleConfig {}
static class DummyAuditingBeanDefinitionRegistrarSupport extends AuditingBeanDefinitionRegistrarSupport {

Loading…
Cancel
Save