如何在使用审计时自定义Spring-Data注入的AuditingHandler?

Eri*_* B. 8 java audit spring spring-data spring-data-jpa

我正在使用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<User> auditorProvider(){
        return new SpringSecurityAuditorAware();
    }

    @Bean
    public AuditingEntityListener auditingEntityListener(){
        AuditingEntityListener listener = new AuditingEntityListener();
        listener.setAuditingHandler(new com.ia.persistence.AuditingHandler());
        return listener;
    }
}
Run Code Online (Sandbox Code Playgroud)

我的定制处理程序

@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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?使用我的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>
Run Code Online (Sandbox Code Playgroud)

任何的意见都将会有帮助.

小智 7

我遇到了同样的问题.

简短的版本

您必须使用注册jpaAuditingHandlerbean定义BeanDefinitionRegistry.

长版

org.springframework.data.jpa.domain.support.AuditingEntityListener是一个在编译时与aspectj混合的特殊类.看到这里

它需要一个bean定义才能工作.看看spring框架文档.

org.springframework.data.jpa.repository.config.EnableJpaAuditing您使用将注册auditingHandler绑定到一个bean定义jpaAuditingHandler豆.它还将注册jpaAuditingHandlerbean定义.

如果你添加一个jpaAuditingHandler使用@Component,它将无法工作,因为Spring更喜欢另一个.看到org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass

所以你必须使用注册你的bean定义BeanDefinitionRegistry.

public class jpaAuditingHandlerRegistrar implements ImportBeanDefinitionRegistrar {
    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
        registry.registerBeanDefinition("jpaAuditingHandler", BeanDefinitionBuilder
                .rootBeanDefinition(JpaAuditingHandler.class)
                .addConstructorArgReference("jpaMappingContext")
                .getBeanDefinition());
    }
}
Run Code Online (Sandbox Code Playgroud)

并添加@Import(JpaAuditingHandlerRegistrar.class)到您的Configuration类

@SpringBootApplication
@EnableJpaAuditing
@Import(JpaAuditingHandlerRegistrar.class)
public class Application {
Run Code Online (Sandbox Code Playgroud)

我把示例代码https://github.com/macdao/customize-auditing-handler