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

spring data mongo不能启动自定义ZonedDateTime转换器,为什么?

拓拔弘扬
2023-03-14

当使用Spring Boot>=2.0.1.Release将ZonedDateTime保存到MongoDB时,我的问题就像这个CodecConfigurationException

但我编写了一个自定义的ZonedDateTime转换器:

@WritingConverter
public class ZonedDateTimeToDateConverter implements Converter<ZonedDateTime, Date> {
    @Override
    public Date convert(ZonedDateTime source) {
        if (source == null) {
            return null;
        }
        return Date.from(source.toInstant());
    }
}

DateToZonedDateTimeConverter

@ReadingConverter
public class DateToZonedDateTimeConverter implements Converter<Date, ZonedDateTime> {
    @Override
    public ZonedDateTime convert(Date source) {
        if (source == null) {
            return null;
        }
        return ZonedDateTime.ofInstant(source.toInstant(), ZoneId.of("UTC"));
    }
}

而我的测试:

@Autowired
ReactiveMongoOperations operations;

@Test
void test() {
    ObjectId id = new ObjectId();

    Document doc = new Document();
    doc.append("_id", id);
//    doc.append("a", ZonedDateTime.now()); // works
    doc.append("zd1", new Document("f", ZonedDateTime.now())); // not working

    operations.insert(doc, "test-collection").block();

    Document found = Mono.from(operations.getCollection("test-collection")
            .find(new Document("_id", id)).first()).block();

    Assertions.assertNotNull(found);
}

如果我将一个ZDT实例添加到一个文档的第一级,像这样doc.append(“a”,zoneddatetime.now())-document saves fine。但是,如果我将ZDT实例作为嵌套字段放置到文档(嵌套的第二级),则会收到一个异常:

我做错了什么?

共有1个答案

太叔逸春
2023-03-14

我通过将转换器添加到自定义转换器配置来解决类似问题:

@Configuration
public class MongoCustomConverterConfig {

    @Bean
    public MongoCustomConversions mongoCustomConversions(){
        List<Converter<?,?>> converters = new ArrayList<>();
        converters.add(new ZoneDateTimeWriteConverter());
        converters.add(new ZonedDateTimeReadConverter());
        return new MongoCustomConversions(converters);
    }
}
 类似资料:
  • 主要内容:JSF自定义转换器实例我们可以在JSF中创建自己的自定义转换器。 以下列表是我们可以在JSF中创建自定义转换器的步骤。 通过实现接口创建一个转换器类。 实现上述接口的和方法。 使用注解为自定义转换器分配唯一的ID。 JSF自定义转换器实例 打开 NetBeans IDE 创建一个Web工程:CustomConverter,其目录结构如下所示 - 创建以下文件代码,文件:index.xhtml 的代码内容如下所示 - 文

  • I'v开始寻找很好的解决方案,如何使用Spring CassandraOperations很好地持久化实体。问题的出现是因为我的实体中的某些字段不支持cassandra,例如joda DateTime。 解决方法是在java类型的同一实体中有其他字段。util。Date而不是joda DateTime,用@Transient标记未要求的字段。但这并不干净,所以我开始寻找自动自定义转换。 目前,sp

  • 我正在开发一个Spring启动自定义启动器,其中pom包含一些依赖项(其他启动器、库),并且这个启动器执行一些关于jwt过滤的配置,以允许过滤器处于安全水位。问题是当我在另一个项目(starter-消费者)中添加我的自定义启动器作为pom依赖项时,它似乎检测到我要导入的类,但IntelliJ什么也没做。 也许我没有正确打包启动器,或者至少我在里面编码的类。启动器在pom中包含的其他依赖项被成功添加

  • 在很多的 Linux 环境中,你可以通过修改文件 .desktop 来在它的启动器中添加自定义条目。 关于Canonical 的 Unity 启动器文档, 参考 Adding Shortcuts to a Launcher. 可以通过 freedesktop.org Specification网站,找到更详细的参考信息。 Audacious 的启动器快捷方式: 一般情况下,在快捷键menu中为每一

  • 我是java.time包的新手。我有一个本地日期是2015-12-10。我需要将此转换为ZonedDateTime。时间应该是00:00:00,区域是zoneoffset.utc。 dateTimeException:无法从java.time.localDate类型的TemporalAccessor:2015-12-10获取Instant 我也试过: 这会产生意想不到的结果。 我查看了API并尝试

  • Excel中的datetime保存为1900-01-01之后的天数(1,因为它认为1900-02-29发生了)。数字中的分数是一天中的时间偏移量。 这个数字没有时区的概念。所以12.5是1900-01-12T12:00:00在您打开电子表格的时区。在科罗拉多州打开它,它显示中午。在德国打开它,它显示中午。这不是瞬间,而是LocalDateTime。 对于我们的系统,我们将所有内容存储为Offset