gpt4 book ai didi

java - Spring data cassandra 中的自定义编解码器读取问题

转载 作者:行者123 更新时间:2023-12-01 08:53:07 25 4
gpt4 key购买 nike

我的 Cassandra 表中有一个时间戳字段,我想将其映射到 Java Instant类型。在写作时实现这一点相当容易。

我添加custom codecs .

@Override
protected ClusterBuilderConfigurer getClusterBuilderConfigurer() {
return clusterBuilder -> {

clusterBuilder.getConfiguration().getCodecRegistry()
.register(InstantCodec.instance,
LocalDateCodec.instance,
LocalTimeCodec.instance);
return clusterBuilder;
};
}

告诉 spring 不要将我的 Instant 转换为其他类型。

private enum InstantWriteConverter implements Converter<Instant, Instant> {
INSTANT;

@Override
public Instant convert(Instant source) {
return source;
}
}

这样 Instant 就会按原样传递并由 InstantCodec 处理。

但是当从 Cassandra 读回时,读取时间戳会映射到 Date我无法改变这种行为。因此,我需要向我的实体添加一个特殊的构造函数,以便将日期转换为即时。

我的分析。解析Row数据时,Cassandra performs a look找到合适的编解码器。它不尊重所提供的实体构造函数的参数类型,而只是选择第一个可以处理行数据的编解码器。在我的例子中,它选择时间戳->日期编解码器,因为它出现在CodecRegistry codecs中的时间戳->即时编解码器之前。列表。

有什么方法可以直接将时间戳转换为 Instant 吗?

EDIT

尝试注册读写转换器,但读取转换器没有被使用。

    @WritingConverter
private enum InstantWriteConverter implements Converter<Instant, Long> {
INSTANT;

@Override
public Long convert(Instant source) {
return source.toEpochMilli();
}
}

@ReadingConverter
private enum InstantReadConverter implements Converter<Long, Instant> {
INSTANT;

@Override
public Instant convert(Long source) {
return Instant.ofEpochMilli(source);
}
}

最佳答案

成功了。读取转换器需要位于行->类级别。

    @Override
protected ClusterBuilderConfigurer getClusterBuilderConfigurer() {
return clusterBuilder -> {

clusterBuilder.getConfiguration().getCodecRegistry()
.register(InstantCodec.instance,
LocalDateCodec.instance,
LocalTimeCodec.instance);
return clusterBuilder;
};
}

@Override
public CustomConversions customConversions() {
return new CustomConversions(
Arrays.asList(ReadConverter.INSTANCE,
InstantWriteConverter.INSTANCE,
LocalTimeWriteConverter.INSTANCE,
DurationWriteConverter.INSTANCE,
LocalDateWriteConverter.INSTANCE));
}

@ReadingConverter
private enum ReadConverter implements Converter<Row, FlightFareInfo> {
INSTANCE;

@Override
public FlightFareInfo convert(Row source) {

return FlightFareInfo.convertFromRow(source);
}
}

关于java - Spring data cassandra 中的自定义编解码器读取问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42248837/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com