【问题标题】: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"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-22
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多