【问题标题】:How can I customize the AuditingHandler injected by Spring-Data when using Auditing?使用 Auditing 时如何自定义 Spring-Data 注入的 AuditingHandler?
【发布时间】:2014-04-17 14:01:59
【问题描述】:

我正在使用 Spring Data 1.5 和审计。 AuditingEntityListener 的一部分有一个setAuditingHandler 方法。

如何自定义 AuditingHandler 并指示 Spring-Data 注入我的自定义处理程序而不是默认的 org.springframework.data.auditing.AuditingHandler

我尝试实例化我自己的AuditingEntityListener,在其中注入我自己的处理程序,但这并没有起到作用。默认处理程序仍在注入中。我已经尝试过通过 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>

任何建议都会有所帮助。

【问题讨论】:

  • 是的,使用 Spring 的架构你可以!
  • @shazin 您能否提供更多详细信息?我不知道在哪里/如何指定我的自定义处理程序而不是默认处理程序。

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


【解决方案1】:

我遇到了同样的问题。

短版

您必须使用BeanDefinitionRegistry 注册jpaAuditingHandler bean 定义。

长版

org.springframework.data.jpa.domain.support.AuditingEntityListener 是一个特殊的类,它在编译时与 aspectj 混合在一起。见here

它需要一个 bean 定义才能工作。请参阅 spring 框架文档。

您正在使用的org.springframework.data.jpa.repository.config.EnableJpaAuditing 将使用auditingHandler 注册bean 定义绑定到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

【讨论】:

  • 只是链接到你自己的东西是not a good answer。涉及非现场资源的好答案包括此处为未来用户提供的答案的基本部分,并参考以下内容:您在说什么?我在哪里安装它?我该如何安装它?我如何使用这个东西来解决我的问题中的确切问题?您是否以任何方式、形状或形式与此事物相关联? 请参阅:How can I link to an external resource in a community-friendly way?
猜你喜欢
  • 2019-06-05
  • 2015-04-18
  • 2018-05-26
  • 2019-12-19
  • 2016-12-01
  • 2018-01-09
  • 2017-07-30
  • 2016-09-10
  • 1970-01-01
相关资源
最近更新 更多