在使用审计时,如何自定义Spring-Data注入的AuditingHandler?

我正在使用Spring Data 1.5和Auditing。 AuditingEntityListener有一个setAuditingHandler方法。

如何自定义AuditingHandler并指示Spring-Data注入我的自定义处理程序而不是默认的org.springframework.data.auditing.AuditingHandler

我已经尝试实例化我自己的AuditingEntityListener ,我在其中注入了我自己的Handler,但这并没有完成这项工作。 默认处理程序仍在注入。 我已经通过XML配置和JavaConfig尝试了,看看是否有一个比另一个更好,但两种方式都不起作用。

JavaConfig:

 @Configuration @EnableJpaAuditing(auditorAwareRef="auditorProvider") public class AppConfig { @Bean public AuditorAware auditorProvider(){ return new SpringSecurityAuditorAware(); } @Bean public AuditingEntityListener auditingEntityListener(){ AuditingEntityListener listener = new AuditingEntityListener(); listener.setAuditingHandler(new com.ia.persistence.AuditingHandler()); return listener; } } 

自定义处理程序:

 @Component public class AuditingHandler extends org.springframework.data.auditing.AuditingHandler { // SLF4J logger private static final Logger logger = LoggerFactory.getLogger(AuditingHandler.class); /* (non-Javadoc) * @see org.springframework.data.auditing.AuditingHandler#markCreated(java.lang.Object) */ @Override public void markCreated(Object source) { logger.info("Custom handler"); super.markCreated(source); } /* (non-Javadoc) * @see org.springframework.data.auditing.AuditingHandler#markModified(java.lang.Object) */ @Override public void markModified(Object source) { logger.info("Custom handler"); super.markModified(source); } } 

我究竟做错了什么? 使用我的JavaConfig,我甚至没有看到Spring使用我的配置实例化侦听器。 或者,我尝试使用XML配置来配置侦听器,但默认侦听器仍然是使用的侦听器。

       

任何的意见都将会有帮助。

我遇到了同样的问题。

短版

您必须使用BeanDefinitionRegistry注册jpaAuditingHandler bean定义。

长版

org.springframework.data.jpa.domain.support.AuditingEntityListener是一个特殊的类,在编译时与aspectj混合在一起。 看到这里

它需要一个bean定义才能工作。 看看spring框架文档。

您正在使用的org.springframework.data.jpa.repository.config.EnableJpaAuditing将使用auditingHandler绑定到jpaAuditingHandler bean来注册bean定义。 它还将注册jpaAuditingHandler bean定义。

如果使用@Component添加jpaAuditingHandler ,它将无法工作,因为Spring更喜欢另一个。 请参阅org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass

所以你必须使用BeanDefinitionRegistry注册你的bean定义。

 public class jpaAuditingHandlerRegistrar implements ImportBeanDefinitionRegistrar { @Override public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) { registry.registerBeanDefinition("jpaAuditingHandler", BeanDefinitionBuilder .rootBeanDefinition(JpaAuditingHandler.class) .addConstructorArgReference("jpaMappingContext") .getBeanDefinition()); } } 

并将@Import(JpaAuditingHandlerRegistrar.class)添加到您的Configuration类

 @SpringBootApplication @EnableJpaAuditing @Import(JpaAuditingHandlerRegistrar.class) public class Application { 

我把示例代码https://github.com/macdao/customize-auditing-handler