在 Spring Data MongoDB 中为 ZonedDateTime 注册一个新的可审计日期转换器

2024-03-15

我想要我的可审计(@CreatedDate and @LastModifiedDate) 要使用的 MongoDB 文档ZonedDateTime fields.

显然 Spring Data 不支持这种类型(看看org.springframework.data.auditing.AnnotationAuditingMetadata).

框架版本:春季启动2.0.0 and Spring数据MongoDB 2.0.0

Spring数据审计错误:

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].

MongoDB配置:

@Configuration
@EnableMongoAuditing
public class MongoConfiguration {

}

可审计实体:

public abstract class BaseDocument {

    @CreatedDate
    private ZonedDateTime createdDate;

    @LastModifiedDate
    private ZonedDateTime lastModifiedDate;

}

我尝试过的事情

我还尝试创建一个自定义转换器ZonedDateTime,但 Spring Data 不考虑它。班上DateConvertingAuditableBeanWrapper has a ConversionService在构造函数方法中配置为JodaTimeConverters, Jsr310Converters and ThreeTenBackPortConverters.

自定义转换器:

@Component
public class LocalDateTimeToZonedDateTimeConverter implements Converter<LocalDateTime, ZonedDateTime> {

    @Override
    public ZonedDateTime convert(LocalDateTime source) {
        return source.atZone(ZoneId.systemDefault());
    }

}

Spring Data DateConvertingAuditableBeanWrapper:

class DefaultAuditableBeanWrapperFactory implements AuditableBeanWrapperFactory {

    abstract static class DateConvertingAuditableBeanWrapper implements AuditableBeanWrapper {

        private final ConversionService conversionService;

    }
}

是否可以审核ZonedDateTime fields?

如何注册转换器?


创建一个DateTimeProvider https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/auditing/DateTimeProvider.html提供审核时使用的当前时间:

@Component("dateTimeProvider")
public class CustomDateTimeProvider implements DateTimeProvider {
    
    @Override
    public Optional<TemporalAccessor> getNow() {
        return Optional.of(ZonedDateTime.now());
    }
}

进而:

  • 参考DateTimeProvider https://docs.spring.io/spring-data/commons/docs/current/api/org/springframework/data/auditing/DateTimeProvider.html组件中的@EnableMongoAuditing https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/config/EnableMongoAuditing.html注解;
  • Create Converter https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/convert/converter/Converter.htmls for Date https://docs.oracle.com/javase/10/docs/api/java/util/Date.html and ZonedDateTime https://docs.oracle.com/javase/10/docs/api/java/time/ZonedDateTime.html;
  • Add the Converter https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/core/convert/converter/Converter.html实例到MongoCustomConversions https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/convert/MongoCustomConversions.html实例;
  • 暴露MongoCustomConversions https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/convert/MongoCustomConversions.html实例作为@Bean https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Bean.html.
@Configuration
@EnableMongoAuditing(dateTimeProviderRef = "dateTimeProvider")
public class MongoConfiguration {
    
    @Bean
    public MongoCustomConversions customConversions() {
        List<Converter<?, ?>> converters = new ArrayList<>();
        converters.add(new DateToZonedDateTimeConverter());
        converters.add(new ZonedDateTimeToDateConverter());
        return new MongoCustomConversions(converters);
    }

    class DateToZonedDateTimeConverter implements Converter<Date, ZonedDateTime> {

        @Override
        public ZonedDateTime convert(Date source) {
            return source == null ? null : 
                    ZonedDateTime.ofInstant(source.toInstant(), ZoneId.systemDefault());
        }
    }

    class ZonedDateTimeToDateConverter implements Converter<ZonedDateTime, Date> {

        @Override
        public Date convert(ZonedDateTime source) {
            return source == null ? null : Date.from(source.toInstant());
        }
    }
}

但是,我不会使用ZonedDateTime https://docs.oracle.com/javase/10/docs/api/java/time/ZonedDateTime.html以此目的。我会坚持OffsetDateTime https://docs.oracle.com/javase/10/docs/api/java/time/OffsetDateTime.html:

OffsetDateTime https://docs.oracle.com/javase/10/docs/api/java/time/OffsetDateTime.html, ZonedDateTime https://docs.oracle.com/javase/10/docs/api/java/time/ZonedDateTime.html and Instant https://docs.oracle.com/javase/10/docs/api/java/time/Instant.html它们都以纳秒精度存储时间线上的瞬间。 Instant是最简单的,简单的代表瞬间。OffsetDateTime https://docs.oracle.com/javase/10/docs/api/java/time/OffsetDateTime.html添加与 UTC/格林威治的偏移量,这样就可以获取本地日期时间。ZonedDateTime https://docs.oracle.com/javase/10/docs/api/java/time/ZonedDateTime.html添加完整的时区规则。

其目的是ZonedDateTime https://docs.oracle.com/javase/10/docs/api/java/time/ZonedDateTime.html or Instant https://docs.oracle.com/javase/10/docs/api/java/time/Instant.html用于在更简单的应用程序中对数据进行建模。当更详细地建模日期时间概念时,或者当与数据库或网络协议进行通信时,可以使用此类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring Data MongoDB 中为 ZonedDateTime 注册一个新的可审计日期转换器 的相关文章

随机推荐

  • 禁用该复选框时不应进行更新

    我有两页 一页是管理员 另一页是教师 管理员将科目分配给教师 教师只想选择所需的时间 我的问题是我不想对禁用的复选框执行更新查询 我已经尝试了下面的代码 但它也在更新禁用复选框 using SqlConnection con2 new Sq
  • 当 A-lx 是奇异且无解时的特征向量

    R 如何找到以下矩阵的特征向量 特征值是 2 2 所以特征向量需要求解solve matrix c 0 1 0 0 2 2 这是无解的奇异矩阵 gt eigen matrix c 2 1 0 2 2 2 values 1 2 2 vecto
  • 了解elasticsearch jvm堆的使用情况

    Folks 我正在尝试减少 Elasticsearch 部署 单节点集群 中的内存使用量 我可以看到正在使用 3GB JVM 堆空间 为了优化 我首先需要了解瓶颈 我对 JVM 使用如何分配的了解有限 字段数据看起来消耗 1 5GB 过滤器
  • 如何使用 PhpStorm 和 Xdebug 调试 AJAX (POST)?

    我已将 PhpStorm 配置为调试 HTTP GET 但仅当我直接加载页面时 当我想要调试 AJAX 时 我获取 JS 请求的 URL 并创建一个 PhpStorm 配置来调试它 不是特别优雅 是吗 当然 我不能对 POST 请求这样做
  • 什么是投影?

    从数据库理论和 NHibernate 的角度来看 使用 SetProjection 时什么是投影 投影是关系代数的基本运算之一 它采用一个关系和该关系的属性列表 可能为空 作为输入 它输出仅包含指定属性列表的关系删除重复的元组 换句话说 输
  • 多个事实的聚合解决方案

    尝试创建一个谓词 timePeriod 2 计算特定事实的两个日期之间的时间段 我已经设法自己做到这一点 但当 其他答案 存在于同一列表中时会遇到问题 即更容易用示例解释 我有以下知识基础事实 popStar Jackson 1987 19
  • 以 HTML 代码作为输入的 Angular 组件

    我正在创建一个角度组件 它显示突出显示的 HTML 代码及其执行结果 显示的 HTML 代码位于 pre html 元素内 至于结果的预览 它是硬编码的 pre class prettyprint lang html lt button t
  • 带 Join 的 TSQL Update 语句

    我有两个具有父 子关系的表 我想用孩子的数据更新父母 但是 假设有 2 个孩子 我希望能够根据孩子的其他列来选择哪个孩子用于更新 这是我到目前为止所拥有的 父级 test 孩子 exdat 预期结果 更新后父级的结果应仅包含大写字母 我想用
  • 如何在一页中执行多个查询?

    我编写了这段代码 但是当我运行它时没有输出 没有错误但是问题没有输出 如何在同一页面中执行多个查询
  • ConstraintLayout 问题 - ImageView 16:9 上边距不合适

    我想使用 ConstraintLayout 构建以下布局 我使用这个源进行布局
  • Python记录器不尊重setLevel?

    我花了一些时间浏览网站上的 Python 记录器问题 希望我的问题能在那里得到解决 我已经设置了一个带有两个流处理程序的记录器 它们具有不同的格式和日志记录级别 这是我的代码库中的功能片段 import os import time imp
  • 如何从选定的文本中获取相邻字符?

    我有一个像这样的字符串 var comment this is a test Assume this i已选择 现在我需要null 左侧 和s 右边 我怎样才能得到它们 我可以像这样获取选定的文本 function getSelection
  • Shapeless 不适用于一般环境

    我仍在尝试了解 Shapeless 以及较小程度上的 Scala 并且我一直在编写一些简单的代码来为案例类生成随机实例数据 主要基于此处的指南 http enear github io 2016 09 27 bits of shapeles
  • 在没有窗口引用的选项卡 dom 之间进行通信[重复]

    这个问题在这里已经有答案了 我使用以下命令打开包含一些页面内容的新选项卡 在新进程中 var p document getElementById myElement var a document createElement a a setA
  • 如何使用 knit/Sweave 中 R 变量的值在 LaTeX 中编写 if-then 语句

    我目前正在使用 knitr 以及 R 3 0 2 和 RStudio 来生成 LaTeX 报告 我的报告被输入为 Rnw 文件 并使用 knit2pdf 函数进行编译 我想用一个LaTeX 中的 if then 公式 http en wik
  • 视图模型的单独项目以“实施”MVVM:如何打开对话框?

    在遵守 MVVM 模式的同时打开对话框似乎是常见问题之一 此处和其他地方 我知道有像 MVVM light 这样的框架可以解决这个问题 但我目前正在开发一个非常小的个人项目 出于学习目的 我尝试自己完成大部分工作 为了 强迫 自己注意引用
  • 如何在 Swift 3 中使用 Facebook API 访问个人资料图片?

    早些时候我尝试像这样访问 let gr2 FBSDKGraphRequest FBSDKGraphRequest graphPath me parameters fields id picture width 198 height 198
  • 围绕文本创建表格

    我有一个单词列表 每个单词都独占一行 这是表格的第一列 我想手动创建第二列 我现在想使用一些插件 它将在文本周围创建一个 ASCII 表 因此我有很好的格式 每列中的起始字母应该在一个 垂直线 中 或者我应该能够快速移动到通过一个快捷方式正
  • 期望 ssh 脚本返回无效命令名

    我正在尝试编写一个 Expect 脚本 该脚本将 ssh 进入服务器 发送 sudo su 然后检查 iptables 状态并将输出放入服务器上的日志文件中 下面是脚本 1 usr bin expect 2 exp internal 1 3
  • 在 Spring Data MongoDB 中为 ZonedDateTime 注册一个新的可审计日期转换器

    我想要我的可审计 CreatedDate and LastModifiedDate 要使用的 MongoDB 文档ZonedDateTime fields 显然 Spring Data 不支持这种类型 看看org springframewo