当前位置: 首页 > 知识库问答 >
问题:

Mongo 可审核 ZonedDateTime 字段在 Spring Boot 2 中不起作用

万高畅
2023-03-14

在一个Spring Boot项目中,我使用像@CreatedDate这样的注释来保存关于相应文档创建/更新日期的信息。ZonedDateTime在整个项目中使用,因此带注释的字段也是ZonedDateTime。为了实现Mongo的日期格式和ZonedDateTime之间的转换,使用了自定义转换器。

现在,当使用Spring Boot 1.5.x时,自定义转换器可以完美地用于可审计字段。在Spring Boot 2.0.x中,自定义转换器适用于所有字段,但不适用于可审核字段。因此,如果我删除@EnableMongoAuditing,一切正常(整个项目中的所有ZonedDateTime字段都保留到Mongo并正确从Mongo读取),但创建/更新的日期字段为空。如果我启用 mongo 审核,则在尝试保存文档时会出现以下异常:

java.lang.IllegalArgumentException: Invalid date type for member <MEMBER NAME>!
Supported types are [org.joda.time.DateTime, org.joda.time.LocalDateTime, java.util.Date, java.lang.Long, long]

我的Mongo配置:

@Configuration
@EnableMongoAuditing
public class MongoConfig {
    @Bean
    public MongoCustomConversions customConversions(){
        List<Converter<?,?>> converters = new ArrayList<>();
        converters.add(new ZonedDateTimeToDateConverter());
        converters.add(new DateToZonedDateTimeConverter());
        return new MongoCustomConversions(converters);
    }
}

以下是相应字段的外观:

abstract class BaseModel {

    @Id
    private String id;
    @CreatedDate
    private ZonedDateTime created;
    @LastModifiedDate
    private ZonedDateTime updated;
}

有没有办法让转换器适用于 mongo 可审计字段,除了降级到 Spring Boot 1.5.x?

共有1个答案

张和颂
2023-03-14

除了注册一个MongoCustomConversionsbean之外。创建DateTimeProvider的bean,并将其注册到您的@EnableXXXAuditing(datetimeprovisiderref=“DateTimeProvider”)

public class CustomDateTimeProvider implements DateTimeProvider {

    @Override
    public Optional<TemporalAccessor> getNow() {
        return Optional.of(ZonedDateTime.now());
    }
}
@Configuration
@EnableMongoAuditing(dateTimeProviderRef = "dateTimeProvider") // beanName
public class MongoConfig {
    @Bean
    public MongoCustomConversions customConversions(){
        List<Converter<?,?>> converters = new ArrayList<>();
        converters.add(new ZonedDateTimeToDateConverter());
        converters.add(new DateToZonedDateTimeConverter());
        return new MongoCustomConversions(converters);
    }

    // The DateTimeProvider bean with beanName="dateTimeProvider" is registered here
    @Bean
    public DateTimeProvider dateTimeProvider() {
        return new CustomDateTimeProvider();
    }
}

当您使用@EnableXXXAuditing时,Spring将注册一个AuditHandler,负责将审核数据添加到您的模型中。它有两个主要组件:DateTimeProvider和AuditorAware

@EnableXXXAuditing(
    auditorAwareRef = "auditorAware", // beanName
    dateTimeProviderRef = "dateTimeProvider" // beanName
)
  • DateTimeProvider简而言之,负责@CreatedDate@LastModifiedDate
  • AuditorAware简而言之,负责@CreatedBy@LastModifiedBy

DateTimeProvider的默认实现是CurrentDateTimeProvider,它返回LocalDateTime。这就是为什么您的ZonedDateTimeCreatedDate、LastModifiedDate出现错误的原因。

 类似资料:
  • 我正在使用Spring Mongo审计和@CreatedDate@CreatedBy不工作,但@LastModifiedDate和@LastModifiedBy工作正常。 我在配置类上添加了@EnableMongoAudting,并定义了AuditAware。 审核类别为: 当我保存文档时,它在createdOn和createdBy中都设置为null,但在modifiedOn和modifiedBy

  • 我正在构建一个Spring启动应用程序。我对这项技术还很陌生。我已经看到了许多关于如何启用审计的示例。我似乎已经遵循了所需的配置和设置。但是在标记lastModifiedBy的“更新”操作期间,审计不起作用 以下是我在项目中的代码。 实体-我ssue.java 一个uditable.java 审核配置。JAVA AuditAwareImpl。JAVA IssueController。JAVA 发行

  • 通过选择,,和,我创建了一个全新的Spring初始化项目。 我做了一个小项目: 我试着将三个人保存到数据库中。保存方法只返回需要执行的Mono。如果我尝试通过简单的订阅来执行它,一切都很好: 但是,当我使用而不是时,应用程序挂起: 如果我手动查询数据库,我会看到Jim已被保存,但Jack和John未被保存。 这是窃听器,还是我做错了什么?我希望在代码进一步发展之前保证用户在数据库中,所以我真的很想

  • 我试着用Springboot2做一些测试,特别是用Reactor(Flux/Mono)。我面临一个问题。 当我尝试使用一个存储库方法做检索我所有的人我使用该方法:@Tailable Flux findRetTailableCursorBy(); 但就我而言,我收到了这个错误 当我将我的收藏设置为“封顶”时,它就起作用了 但出于很多原因,我不会使用封顶系列 无法删除文档(必须删除收藏) 无法通过编程

  • 问题内容: 我正在使用NHibernate,并且正在寻找一种解决方案,该解决方案将允许我审核实体中所有字段的更改。我希望能够为每个实体(例如,用户-> UsersHistory)创建一个历史表,该表将具有与用户表相同的结构,并具有其他字段,例如操作类型(更新,删除),进行更改的用户的userid等。不想为每个实体定义此类。我正在寻找类似的东西(即),因为这些条目不属于我的域,仅用于准备对该实体所做

  • 问题内容: 我已经测试了elasticsearch突出显示字段功能,并且工作正常。我使用了 elasticsearch2.4.4 和 spring-data- elasticsearch-2.0.0.RELEASE 我最近将 elasticsearch 升级到 5.5.0 和 spring-data-elasticsearch-3.0.0.M4 当我测试相同的代码时,突出显示不会发生 下面是示例代