我有一个dynamoDB数据库,我有一个名为user
的表。我想在此表中记录审核(CreatedBy
,LastModifiedBy
,CreatedDate
,LastModifiedDate
)。
我发现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;
}
}
我已将日期分配给相应的字段,但我要设置createdBy
和lastModifiedBy
,具体取决于登录的用户。因此,当在数据库中添加新条目时,我将在运行时动态获取。
我知道如何静态设置这些字段,但问题是如何在运行时使注释知道这些更改。
正如我所提到的,我为JPA和mongo找到了AuditAware
。我需要为dynamoDB提供相同的功能。
任何帮助将不胜感激。因为我是Spring的新手。
答案 0 :(得分:2)
这个问题已经存在多年了,但是如果有人也有这个问题,那么下面的解决方案是可行的。
问题是@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的最干净的解决方案。
答案 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策略。