使用Auditing时,如何自定义Spring-Data注入的AuditingHandler? [英] How can I customize the AuditingHandler injected by Spring-Data when using Auditing?

查看:781
本文介绍了使用Auditing时,如何自定义Spring-Data注入的AuditingHandler?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Spring Data 1.5和Auditing. AuditingEntityListener的一部分具有setAuditingHandler方法.

I'm using Spring Data 1.5 and Auditing. Part of the AuditingEntityListener has a setAuditingHandler method.

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

How can I customize the AuditingHandler and instruct Spring-Data to inject my custom handler instead of the default org.springframework.data.auditing.AuditingHandler?

我尝试实例化自己的AuditingEntityListener,在其中注入自己的Handler,但这没有完成任务.默认处理程序仍在注入.我已经通过XML配置和JavaConfig进行了尝试,以查看一种方法是否比另一种效果更好,但是两种方法均无效.

I've tried instantiating my own AuditingEntityListener in which I inject my own Handler, but that is not doing the job. The default handler is still being injected. I've tried both via XML configuration and JavaConfig to see if one worked better than the other, but neither way works.

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配置来配置侦听器,但是默认的侦听器仍然是使用的侦听器.

What am I doing wrong? With my JavaConfig, I do not even see Spring instantiating the listener using my configuration. Alternatively, I've tried using XML configuration to configure the listener, but the default listener is still the one that is used.

    <!-- 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>

任何建议都会有所帮助.

Any suggestions would be helpful.

推荐答案

我遇到了同样的问题.

I met the same question.

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

You have to register jpaAuditingHandler bean definition using BeanDefinitionRegistry.

org.springframework.data.jpa.domain.support.AuditingEntityListener是一个特殊类,在编译时会与Aspectj混合在一起.参见此处

the org.springframework.data.jpa.domain.support.AuditingEntityListener is a special class which mixed in with aspectj when compiling. see here

它需要一个bean定义才能起作用.请参阅spring框架文档.

It need a bean definition to work. see the spring framework document.

您正在使用的org.springframework.data.jpa.repository.config.EnableJpaAuditing将通过绑定到jpaAuditingHandler bean的auditingHandler来注册bean定义.它还将注册jpaAuditingHandler bean定义.

the org.springframework.data.jpa.repository.config.EnableJpaAuditing you are using will register the bean definition with auditingHandler bind to a jpaAuditingHandler bean. It also will register the jpaAuditingHandler bean definition.

如果使用@Component添加jpaAuditingHandler,则它将不起作用,因为Spring更喜欢另一个.参见org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass

If you add a jpaAuditingHandler using @Component, it won't work because Spring prefer another one. see org.springframework.context.annotation.ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForConfigurationClass

因此,您必须使用BeanDefinitionRegistry注册bean定义.

So you have to register your bean definition using BeanDefinitionRegistry.

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

这篇关于使用Auditing时,如何自定义Spring-Data注入的AuditingHandler?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆