Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Spring Boot中使用DynamoDB实现审计?_Java_Spring_Spring Boot_Amazon Dynamodb_Auditing - Fatal编程技术网

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

Java 如何在Spring Boot中使用DynamoDB实现审计?,java,spring,spring-boot,amazon-dynamodb,auditing,Java,Spring,Spring Boot,Amazon Dynamodb,Auditing,我有一个dynamoDB数据库,其中有一个名为user的表。我想在此表中记录审核(CreatedBy,LastModifiedBy,CreatedDate,LastModifiedDate) 我发现JPA审计()和MongoDB审计分别带有注释@EnableJpaAuditing和@EnableMongoAuditing。但很明显,他们并没有使用dynamoDB 下面是我的审计抽象类: @DynamoDBDocument public abstract class PQSSAbstrac

我有一个dynamoDB数据库,其中有一个名为
user
的表。我想在此表中记录审核(
CreatedBy
LastModifiedBy
CreatedDate
LastModifiedDate

我发现JPA审计()和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;
    }
}
我已经为各个字段分配了日期,但我必须根据登录用户设置
createdBy
lastModifiedBy
。所以我必须在运行时动态地获取数据,当新的条目被添加到数据库中时。
我知道如何静态设置这些字段,但问题是如何让注释在运行时知道这些更改

正如我提到的,我发现JPA和mongo的
AuditAware
。我需要同样的发电机


任何帮助都将不胜感激。因为我对春靴还不熟悉

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

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

@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; }
始终使用策略(如果希望最后修改日期,请使用此选项):-

@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策略


这个问题已经有好几年了,但如果有人也有这个问题,下面的解决方案是有效的

问题是,
@enabledynamiodbauditing
@enabledynamiodbrepositions
不能正常工作。要解决此问题,您必须向配置类添加两个注释,创建
AuditorAware
DateTimeProvider
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...
}

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

我建议您从Utils类中获取元信息。除此之外,使用version字段@DynamoDBVersionAttribute进行乐观锁定总是很好的,尤其是在审计时。使用dynamoDb的Spring data repo执行积垢操作对不起,这是一个很高层次的解释。你能举个例子吗?我也不知道如何实施它@YatiSawhney请举例说明如何实施。我正在使用dynamodb并使用CRUDEPository扩展存储库。嘿,感谢您的回复,但我的问题不是保存日期,我想保存
CreatedBy
LastModifiedBy
。CreatedBy和LastModifiedBy是您需要在应用程序中设置的用户ID。是的,但在我的应用程序中,不同的用户登录并更新他们的数据库,因此我想通过动态获取当前登录的用户来设置这些字段。我知道如何静态设置这些字段,但问题是如何在运行时让批注知道这些更改?如何将createdBy和lastModifiedBy设置为动态?