如何在Spring Boot中使用DynamoDB实现审计?

时间:2018-02-16 11:45:48

标签: java spring spring-boot amazon-dynamodb auditing

我有一个dynamoDB数据库,我有一个名为user的表。我想在此表中记录审核(CreatedByLastModifiedByCreatedDateLastModifiedDate)。

我发现JPA审核(from here)和MongoDB审核分别带有注释@EnableJpaAuditing@EnableMongoAuditing。但显然他们没有使用dynamoDB。

这是我的审计抽象类:

    @DynamoDBDocument
public abstract class PQSSAbstractAuditingEntity implements Serializable{
    @CreatedBy
    @JsonIgnore
    @DynamoDBAttribute
    private String createdBy;

    @LastModifiedBy
    @JsonIgnore
    @DynamoDBAttribute
    private String lastModifiedBy;

    @CreatedDate
    @JsonIgnore
    @DynamoDBAttribute
    private Date createdDate;

    @LastModifiedDate
    @JsonIgnore
    @DynamoDBAttribute
    private Date lastModifiedDate = new Date();

    public String getCreatedBy() {
        return createdBy;
    }

    public void setCreatedBy(String createdBy) {
        this.createdBy = createdBy;
    }

    public String getLastModifiedBy() {
        return lastModifiedBy;
    }

    public void setLastModifiedBy(String lastModifiedBy) {
        this.lastModifiedBy = lastModifiedBy;
    }

    public Date getCreatedDate() {
        return createdDate;
    }

    public void setCreatedDate(Date createdDate) {
        this.createdDate = createdDate;
    }

    public Date getLastModifiedDate() {
        return lastModifiedDate;
    }

    public void setLastModifiedDate(Date lastModifiedDate) {
        this.lastModifiedDate = lastModifiedDate;
    }
}

我已将日期分配给相应的字段,但我要设置createdBylastModifiedBy,具体取决于登录的用户。因此,当在数据库中添加新条目时,我将在运行时动态获取。 我知道如何静态设置这些字段,但问题是如何在运行时使注释知道这些更改。

正如我所提到的,我为JPA和mongo找到了AuditAware。我需要为dynamoDB提供相同的功能。

任何帮助将不胜感激。因为我是Spring的新手。

2 个答案:

答案 0 :(得分:2)

这个问题已经存在多年了,但是如果有人也有这个问题,那么下面的解决方案是可行的。

问题是@EnableDynamoDBAuditing@EnableDynamoDBRepositories不能一起正常工作。要解决此问题,您必须将两个注释都添加到配置类中,创建AuditorAwareDateTimeProvider bean,然后将所有实体/文档手动添加到DynamoDBMappingContext中。

PersistenceConfiguration.java

@Configuration
@EnableDynamoDBAuditing(auditorAwareRef = "userAuditing", dateTimeProviderRef = "dateAuditing")
@EnableDynamoDBRepositories(basePackages = "your.repository.package.name")
public class PersistenceConfiguration {

    @Bean
    public AuditorAware<String> userAuditing() {
        return () -> Optional.of("TestUser"); //get username from SecurityContext
    }

    @Bean
    public DateTimeProvider dateAuditing() {
        return CurrentDateTimeProvider.INSTANCE;
    }

    @Bean
    public DynamoDBMappingContext dynamoDBMappingContext() {
        DynamoDBMappingContext mappingContext = new DynamoDBMappingContext();

        //add your 'entities' manually 
        mappingContext.getPersistentEntity(YourEntity.class); 

        return mappingContext;
    }

    // do further configuration stuff...
}

YourEntity.java

@DynamoDBTable(tableName = "YourEntity")
public class YourEntity {
   @CreatedDate
   @DynamoDBAttribute
   @DynamoDBTypeConverted(converter = LocalDateTimeConverter.class)
   private LocalDateTime createdOn;

   @CreatedBy
   @DynamoDBAttribute
   private String createdBy;

   @LastModifiedDate
   @DynamoDBAttribute
   @DynamoDBTypeConverted(converter = LocalDateTimeConverter.class)
   private LocalDateTime updatedOn;

   @LastModifiedBy
   @DynamoDBAttribute
   private String updatedBy;

   // add further properties...
}

我知道还有其他一些解决方案,例如@DynamoDBAutoGeneratedTimestamp及其策略的使用,但是在我看来,这是关于使用spring的最干净的解决方案。

答案 1 :(得分:1)

注释@DynamoDBAutoGeneratedTimestamp可与DynamoDBAutoGenerateStrategy一起用于审核项目。

策略创建(用于创建审核): -

@DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.CREATE)
 public Date getCreatedDate() { return createdDate; }
 public void setCreatedDate(Date createdDate) { this.createdDate = createdDate; }

策略总是(如果您想要上次修改日期,请使用此选项): -

 @DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.ALWAYS)
 public Date getLastUpdatedDate() { return lastUpdatedDate; }
 public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; }

如果您想同时创建时间戳和上次修改的时间戳,请创建两个不同的属性。一个属性应该使用CREATE策略,而另一个应该使用ALWAYS策略。

AutoGeneratedTimeStamp