如何创建扩展 AuditingEntityListener 的自定义审计实体侦听器

问题描述

我已经通过 Sping Data JPA 实现了审计,但现在我希望能够控制更新并使用自定义逻辑创建时间戳。所以我想编写一个自定义审计实体侦听器来扩展 Auditingentitylistener。

我有以下通用实体类,我在其中注册自定义审计实体侦听器:

@MappedSuperclass
@Audited
@EntityListeners(CustomAuditingEntityListener.class)
public class AuditableEntity extends BaseEntity {

    @CreatedDate
    @Column(name = "created",nullable = false)
    private Date created;

    @CreatedBy
    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "created_by_id",foreignKey = @ForeignKey(name = "fk_entity_created_by_id"))
    private Account createdBy;

    @LastModifiedDate
    @Column(name = "last_updated",nullable = false)
    private Date lastUpdated;

    @LastModifiedBy
    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "last_updated_by_id",foreignKey = @ForeignKey(name = "fk_entity_last_updated_by_id"))
    private Account lastUpdatedBy;

    protected AuditableEntity() {
    }

    ...

}

CustomAuditingEntityListener 类定义

@Configurable
public class CustomAuditingEntityListener extends AuditingEntityListener {

    public CustomAuditingEntityListener() {
        super();
    }

    @Override
    @PrePersist
    public void touchForCreate(Object target) {
        if (//custom logic) {
            super.touchForCreate(target);
        }
    }

    @Override
    @PreUpdate
    public void touchForUpdate(Object target) {
        if (//custom logic) {
            super.touchForUpdate(target);
        }
    }

}

自定义审计实体侦听器被正确调用,但当 super.touchForCreate(target)super.touchForUpdate(target)调用时,时间戳未设置,因为 AuditingEntityListener 类中的处理程序为空。

这是 AuditingEntityListener 类的代码

package org.springframework.data.jpa.domain.support;

@Configurable
public class AuditingEntityListener implements ConfigurableObject {
    private ObjectFactory<AuditingHandler> handler;

    public AuditingEntityListener() {
        JoinPoint var2 = Factory.makeJP(ajc$tjp_1,this,this);
        JoinPoint var1 = Factory.makeJP(ajc$tjp_0,this);
        if (this != null && this.getClass().isAnnotationPresent(Configurable.class) && AnnotationBeanConfigurerAspect.ajc$if$bb0((Configurable)this.getClass().getAnnotation(Configurable.class))) {
            AnnotationBeanConfigurerAspect.aspectOf().ajc$before$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$1$e854fa65(this);
        }

        if ((this == null || !this.getClass().isAnnotationPresent(Configurable.class) || !AnnotationBeanConfigurerAspect.ajc$if$bb0((Configurable)this.getClass().getAnnotation(Configurable.class))) && this != null && this.getClass().isAnnotationPresent(Configurable.class) && AbstractDependencyInjectionAspect.ajc$if$6f1(var1)) {
            AnnotationBeanConfigurerAspect.aspectOf().ajc$afterReturning$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$2$1ea6722c(this);
        }

        if (!AnnotationBeanConfigurerAspect.ajc$if$bb0((Configurable)this.getClass().getAnnotation(Configurable.class)) && AbstractDependencyInjectionAspect.ajc$if$6f1(var2)) {
            AnnotationBeanConfigurerAspect.aspectOf().ajc$afterReturning$org_springframework_beans_factory_aspectj_AbstractDependencyInjectionAspect$2$1ea6722c(this);
        }

    }

    public void setAuditingHandler(ObjectFactory<AuditingHandler> auditingHandler) {
        Assert.notNull(auditingHandler,"AuditingHandler must not be null!");
        this.handler = auditingHandler;
    }

    @PrePersist
    public void touchForCreate(Object target) {
        if (this.handler != null) {
            ((AuditingHandler)this.handler.getobject()).markCreated(target);
        }

    }

    @PreUpdate
    public void touchForUpdate(Object target) {
        if (this.handler != null) {
            ((AuditingHandler)this.handler.getobject()).markModified(target);
        }

    }

    static {
        ajc$preClinit();
    }
}

有人能解释一下我如何确保 AuditingHandler 不为 null 并且像认的 AuditingEntityListener 类那样设置吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)