Java 如何在Spring Boot中使用DynamoDB实现审计?
我有一个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
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设置为动态?