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

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

问题描述

我正在使用 Spring Data 1.5 和审计.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,在其中注入我自己的处理程序,但这并没有完成工作.仍在注入默认处理程序.我已经尝试过通过 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.

推荐答案

我遇到了同样的问题.

您必须使用 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 将使用 auditingHandler 绑定注册 bean 定义到 jpaAuditingHandler 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) 添加到您的配置类

and add @Import(JpaAuditingHandlerRegistrar.class) to your Configuration class

@SpringBootApplication
@EnableJpaAuditing
@Import(JpaAuditingHandlerRegistrar.class)
public class Application {

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

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

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