我使用的是Spring Data 1.5和Auditing。 AuditingEntityListener
的一部分有setAuditingHandler
方法。
如何自定义AuditingHandler
并指示Spring-Data注入我的自定义处理程序而不是默认的org.springframework.data.auditing.AuditingHandler
?
我已经尝试实例化我自己的AuditingEntityListener
,其中我注入了我自己的处理程序,但这并没有完成这项工作。默认处理程序仍在注入。我已经通过XML配置和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配置来配置侦听器,但默认侦听器仍然是使用的侦听器。
<!-- 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>
任何建议都会有所帮助。
答案 0 :(得分:5)
我遇到了同样的问题。
您必须使用jpaAuditingHandler
注册BeanDefinitionRegistry
bean定义。
org.springframework.data.jpa.domain.support.AuditingEntityListener
是一个特殊的类,它在编译时与aspectj混合在一起。见here
需要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)
添加到您的配置类
@SpringBootApplication
@EnableJpaAuditing
@Import(JpaAuditingHandlerRegistrar.class)
public class Application {