[英]How to implement Auditing with DynamoDB in Spring Boot?
我有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
。 因此,当新条目添加到数据库中时,我必须在运行时动态获取。 我知道如何静态设置这些字段,但是问题是如何在运行时使注释知道这些更改。
正如我提到的,我已经找到了AuditAware
于JPA和mongo的AuditAware
。 对于dynamoDB,我需要相同的内容。
任何帮助将不胜感激。 因为我是Spring Boot的新手。
注释@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策略。
这个问题已经存在多年了,但是如果有人也有这个问题,下面的解决方案将起作用。
问题是@EnableDynamoDBAuditing
和@EnableDynamoDBRepositories
无法一起正常工作。 要解决此问题,您必须将两个注释都添加到配置类中,创建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...
}
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的最干净的解决方案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.