2017-02-15 45 views
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); 
    } 
} 
+0

您可以注册自定义转换器的元组(读写器)读取'Instant'(见http://docs.spring.io/spring-data/cassandra/docs/current/reference/html/ #cassandra.custom-converters) – mp911de

+0

在读取操作期间,转换器没有得到使用,即时转换为java.util.Date,而不是更少。 – Dexter

回答

0

明白了。读转换器需要在行 - >级别上。

@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); 
    } 
}