【问题标题】:Spring Data MongoDB auditing doesn't work for embedded documentsSpring Data MongoDB 审计不适用于嵌入式文档
【发布时间】:2016-09-16 09:22:47
【问题描述】:
我正在尝试通过使用 Spring Data MongoDB @LastModifiedDate 注释来引入审计。它适用于顶级文档,但我遇到了嵌入对象的问题。
例如:
@Document(collection = "parent")
class ParentDocument {
@Id
String id;
@LastModifiedDate
DateTime updated;
List<ChildDocument> children;
}
@Document
class ChildDocument {
@Id
String id;
@LastModifiedDate
DateTime updated;
}
默认情况下,当我使用内部children 列表保存parentDocument 实例时,updated 值仅设置为parentDocument,而不是children 列表中的任何对象。但在这种情况下,我也想审核它们。有没有办法解决这个问题?
【问题讨论】:
标签:
java
spring
mongodb
spring-data-mongodb
【解决方案1】:
我不知道DateTime 是什么类型,但是LocalDateTime 下一个配置应该可以在spring-boot-starter-data-mongodb-reactive 项目中使用:
@Configuration
public class LastModifiedDateConfig implements ApplicationListener<BeforeConvertEvent<Object>> {
@Override
public void onApplicationEvent(BeforeConvertEvent<Object> event) {
Optional.ofNullable(event)
.map(MongoMappingEvent::getSource)
.filter(ParentDocument.class::isInstance)
.map(ParentDocument.class::cast)
.ifPresent(parentDocument -> parentDocument.updated = LocalDateTime.now());
Optional.ofNullable(event)
.map(MongoMappingEvent::getSource)
.filter(ChildDocument.class::isInstance)
.map(ChildDocument.class::cast)
.ifPresent(childDocument -> childDocument.updated = LocalDateTime.now());
}
}
【解决方案2】:
我决定使用自定义ApplicationListener解决它
public class CustomAuditingEventListener implements
ApplicationListener<BeforeConvertEvent<Object>> {
@Override
public void onApplicationEvent(BeforeConvertEvent<Object> event) {
Object source = event.getSource();
if (source instanceof ParentDocument) {
DateTime currentTime = DateTime.now();
ParentDocument parent = (ParentDocument) source;
parent.getChildren().forEach(item -> item.setUpdated(currentTime));
}
}
}
然后将对应的bean添加到应用上下文中
<bean id="customAuditingEventListener" class="app.CustomAuditingEventListener"/>