在使用审计时,如何自定义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