使用Auditing时如何自定义Spring-Data注入的AuditingHandler? [英] How can I customize the AuditingHandler injected by Spring-Data when using Auditing?
问题描述
我正在使用 Spring Data 1.5 和审计.AuditingEntityListener
的一部分有一个 setAuditingHandler
方法.
I'm using Spring Data 1.5 and Auditing. Part of the AuditingEntityListener
has a setAuditingHandler
method.
如何自定义 AuditingHandler
并指示 Spring-Data 注入我的自定义处理程序而不是默认的 org.springframework.data.auditing.AuditingHandler
?
How can I customize the AuditingHandler
and instruct Spring-Data to inject my custom handler instead of the default org.springframework.data.auditing.AuditingHandler
?
我尝试实例化我自己的 AuditingEntityListener
,在其中注入我自己的处理程序,但这并没有完成工作.仍在注入默认处理程序.我已经尝试过通过 XML 配置和 JavaConfig 来查看一个是否比另一个更好,但两种方法都不起作用.
I've tried instantiating my own AuditingEntityListener
in which I inject my own Handler, but that is not doing the job. The default handler is still being injected. I've tried both via XML configuration and JavaConfig to see if one worked better than the other, but neither way works.
JavaConfig:
JavaConfig:
@Configuration
@EnableJpaAuditing(auditorAwareRef="auditorProvider")
public class AppConfig {
@Bean
public AuditorAware<User> 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 配置来配置侦听器,但仍然使用默认侦听器.
What am I doing wrong? With my JavaConfig, I do not even see Spring instantiating the listener using my configuration. Alternatively, I've tried using XML configuration to configure the listener, but the default listener is still the one that is used.
<!-- enable Spring data-JPA repositories -->
<jpa:repositories base-package="com.ia" />
<bean id="auditingEntityListener" class="org.springframework.data.jpa.domain.support.AuditingEntityListener">
<property name="auditingHandler" ref="auditingHandler"/>
</bean>
任何建议都会有所帮助.
Any suggestions would be helpful.
推荐答案
我遇到了同样的问题.
您必须使用 BeanDefinitionRegistry
注册 jpaAuditingHandler
bean 定义.
You have to register jpaAuditingHandler
bean definition using BeanDefinitionRegistry
.
org.springframework.data.jpa.domain.support.AuditingEntityListener
是一个特殊的类,在编译时混入了aspectj.请参阅此处
the org.springframework.data.jpa.domain.support.AuditingEntityListener
is a special class which mixed in with aspectj when compiling. see here
它需要一个 bean 定义才能工作.参见 spring 框架文档.
It need a bean definition to work. see the spring framework document.
您正在使用的 org.springframework.data.jpa.repository.config.EnableJpaAuditing
将使用 auditingHandler 绑定注册 bean 定义到 jpaAuditingHandler
bean.它还将注册 jpaAuditingHandler
bean 定义.
the org.springframework.data.jpa.repository.config.EnableJpaAuditing
you are using will register the bean definition with auditingHandler bind to a jpaAuditingHandler
bean. It also will register the jpaAuditingHandler
bean definition.
如果您使用@Component 添加一个 jpaAuditingHandler
,它将不起作用,因为 Spring 更喜欢另一个.见 org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass
If you add a jpaAuditingHandler
using @Component, it won't work because Spring prefer another one. see org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass
所以你必须使用 BeanDefinitionRegistry
注册你的 bean 定义.
So you have to register your bean definition using BeanDefinitionRegistry
.
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)
添加到您的配置类
and add @Import(JpaAuditingHandlerRegistrar.class)
to your Configuration class
@SpringBootApplication
@EnableJpaAuditing
@Import(JpaAuditingHandlerRegistrar.class)
public class Application {
我放了示例代码https://github.com/macdao/customize-auditing-handler
这篇关于使用Auditing时如何自定义Spring-Data注入的AuditingHandler?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!