我正在使用 Spring Data 1.5 和审计。 AuditingEntityListener
的一部分有一个 setAuditingHandler
方法。
如何自定义 AuditingHandler
并指示 Spring-Data 注入(inject)我的自定义处理程序而不是默认的 org.springframework.data.auditing.AuditingHandler
?
我已经尝试实例化我自己的 AuditingEntityListener
并在其中注入(inject)我自己的处理程序,但这并没有起到作用。默认处理程序仍在注入(inject)。我已经尝试通过 XML 配置和 JavaConfig 来查看一个是否比另一个更好,但两种方法都不起作用。
Java配置:
@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 配置来配置监听器,但默认监听器仍然是使用的监听器。
<!-- 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>
任何建议都会有所帮助。
最佳答案
我遇到了同样的问题。
简短版
您必须使用 BeanDefinitionRegistry
注册 jpaAuditingHandler
bean 定义。
长版
org.springframework.data.jpa.domain.support.AuditingEntityListener
是一个特殊的类,在编译时与 aspectj 混合在一起。见here
它需要一个 bean 定义才能工作。请参阅 spring 框架文档。
您正在使用的 org.springframework.data.jpa.repository.config.EnableJpaAuditing
会将 bean 定义注册到 auditingHandler 绑定(bind)到 jpaAuditingHandler
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)
添加到您的配置类
@SpringBootApplication
@EnableJpaAuditing
@Import(JpaAuditingHandlerRegistrar.class)
public class Application {
我放了示例代码 https://github.com/macdao/customize-auditing-handler
关于java - 使用Auditing时如何自定义Spring-Data注入(inject)的AuditingHandler?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22368414/