我正在尝试将 MongoDB 和 Spring Data Mongodb 与 ZonedDateTime 一起使用。
为此,我正在使用这些之一,
ZonedDateTimeAsDocumentCodec
。我用这一小段配置以及默认编解码器注册了它
@Bean
fun zonedDateTimeCodecCustomizer() = MongoClientSettingsBuilderCustomizer { clientSettingsBuilder ->
clientSettingsBuilder.codecRegistry(
CodecRegistries.fromRegistries(
MongoClientSettings.getDefaultCodecRegistry(),
CodecRegistries.fromCodecs(
ZonedDateTimeAsDocumentCodec()
)
)
)
}
当存储带有
ZonedDateTime
字段的对象时,它运行良好,但我尝试读取相同的对象时,出现错误:java.lang.reflect.InaccessibleObjectException: Unable to make private java.time.ZonedDateTime(java.time.LocalDateTime,java.time.ZoneOffset,java.time.ZoneId) accessible: module java.base does not "opens java.time" to unnamed module @11bb571c
我对代码进行了一些深入研究,似乎 Spring Data 仅在尝试创建字段的持久实体后才使用编解码器,并且在这样做时,它尝试使构造函数可访问。这是行不通的,抛出异常并将所有过程都扔进垃圾箱。
关于如何使 Spring Data 直接跳转到用于 ZonedDateTime 的编解码器的任何线索?
附注:我知道我有一些解决方法来解决我的问题(Spring Converter 就是其中之一),但如果可能的话,我想坚持使用编解码器。
使用jvm_选项
--add-opens java.base/java.time=ALL-UNNAMED