2017-02-15 82 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); 
    } 
}