java - 使用Auditing时如何自定义Spring-Data注入(inject)的AuditingHandler?

标签 java spring spring-data spring-data-jpa audit

我正在使用 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/

相关文章:

java - 具有使用相同存储库和模型类的多个数据源的 Spring Boot?

java - 从另一个角度提问

java - Selenium(java)无法从嵌套元素获取文本而不打印它

java - 需要一些关于 Java 中的 Lambda 表达式的帮助

spring - Spring上的嵌套事务

java - 如何克服 Spring 和 Jbehave 版本控制问题?

java - Spring Data (JPA) Repository 是线程安全的吗? (也就是 SimpleJpaRepository 线程安全的)

java - 将 spring-data-rest-repository 添加到 spring-data-rest-webmvc

java - 在主线程中等待 HTTP 请求

java - 如何在登录页面中传递已保存在我的数据库中的用户名和密码参数?