问题描述
我正在使用Spring Data 1.5和Auditing. 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
,在其中注入自己的Handler,但这没有完成任务.默认处理程序仍在注入.我已经通过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.
推荐答案
我遇到了同样的问题.
I met the same question.
您必须使用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
将通过绑定到jpaAuditingHandler
bean的auditingHandler来注册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)
添加到您的配置类
@SpringBootApplication
@EnableJpaAuditing
@Import(JpaAuditingHandlerRegistrar.class)
public class Application {
我放置了示例代码 https://github.com/macdao/customize-auditing-handler
这篇关于使用Auditing时,如何自定义Spring-Data注入的AuditingHandler?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!