0
我在我的Cassandra表中有一个时间戳字段,我想映射到Java Instant类型。 写作时很容易做到这一点。我想添加custom codecs。春季数据自定义编解码器读取问题cassandra
@Override
protected ClusterBuilderConfigurer getClusterBuilderConfigurer() {
return clusterBuilder -> {
clusterBuilder.getConfiguration().getCodecRegistry()
.register(InstantCodec.instance,
LocalDateCodec.instance,
LocalTimeCodec.instance);
return clusterBuilder;
};
}
告诉春天不要将我的瞬发转换为其他类型。
private enum InstantWriteConverter implements Converter<Instant, Instant> {
INSTANT;
@Override
public Instant convert(Instant source) {
return source;
}
}
这种方式Instant即时传递并由InstantCodec处理。
但是,当从Cassandra回读时,读取时间戳会映射到Date,我无法更改此行为。由于这个原因,我需要为我的实体添加一个特殊的构造函数来将日期转换为即时。
我的分析。 解析行数据时,Cassandra performs a look可以找到合适的编解码器。它不尊重提供的实体构造函数的参数类型,只是简单地拾取可以处理行数据的第一个编解码器。在我的情况下,它会选择时间戳 - >日期编解码器,因为它存在于CodecRegistry codecs列表中的时间戳 - >即时编解码器之前。
任何方式直接将时间戳转换为即时?
编辑
试图注册的读写器,但读转换器不习惯。
@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);
}
}
您可以注册自定义转换器的元组(读写器)读取'Instant'(见http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/ #cassandra.custom-converters) – mp911de
在读取操作期间,转换器没有得到使用,即时转换为java.util.Date,而不是更少。 – Dexter