Apache Cassandra的Spring Data将java.time.LocalDateTime转换为UTC
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Apache Cassandra的Spring Data将java.time.LocalDateTime转换为UTC,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3375字,纯文字阅读大概需要5分钟。
内容图文
我试图在我的Cassandra数据库中持久保存java.time.LocalDateTime对象并保持时区不可知.我使用Spring Data Cassandra来做到这一点.
问题是,沿着这条线的某个地方,某些东西正在将这些LocalDateTime对象视为在我的服务器的时区中,并在将它们存储在数据库中时将它们偏移到UTC时间.
这是一个错误还是一个功能?我能以某种方式解决这个问题吗?
组态:
@Configuration
@EnableCassandraRepositories(
basePackages = "my.base.package")
public class CassandraConfig extends AbstractCassandraConfiguration{
@Override
protected String getKeyspaceName() {
return "keyspacename";
}
@Bean
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster =
new CassandraClusterFactoryBean();
cluster.setContactPoints("127.0.0.1");
cluster.setPort(9142);
return cluster;
}
@Bean
public CassandraMappingContext cassandraMapping()
throws ClassNotFoundException {
return new BasicCassandraMappingContext();
}
}
预订记录我希望坚持:
@Table("booking")
public class BookingRecord {
@PrimaryKeyColumn(
ordinal = 0,
type = PrimaryKeyType.PARTITIONED
)
private UUID bookingId = null;
@PrimaryKeyColumn(
ordinal = 1,
type = PrimaryKeyType.CLUSTERED,
ordering = Ordering.ASCENDING
)
private LocalDateTime startTime = null;
...
}
简单的存储库接口:
@Repository
public interface BookingRepository extends CassandraRepository<BookingRecord> { }
保存电话:
...
@Autowired
BookingRepository bookingRepository;
...
public void saveBookingRecord(BookingRecord bookingRecord) {
bookingRepository.save(bookingRecord);
}
以下是用于填充BookingRecord中的开始时间的字符串:
"startTime": "2017-06-10T10:00:00Z"
以下是持久保存时间戳后cqlsh的输出:
cqlsh:keyspacename> select * from booking ;
bookingid | starttime
--------------------------------------+--------------------------------
8b640c30-4c94-11e7-898b-6dab708ec5b4 | 2017-06-10 15:00:00.000000+0000
解决方法:
我确实想在我的项目中使用LocalDateTime和LocalDate,而不是java.util.Date,因为它们更新并且具有更具吸引力的功能.
经过多次搜索,我找到了一个解决方法.
首先,您必须创建Spring的Converter接口的自定义实现,如下所示:
一个日期到LocalDateTime:
public class DateToLocalDateTime implements Converter<Date, LocalDateTime> {
@Override
public LocalDateTime convert(Date source) {
return source == null ? null : LocalDateTime.ofInstant(source.toInstant(), ZoneOffset.UTC);
}
}
还有一个用于LocalDateTime的日期:
public class LocalDateTimeToDate implements Converter<LocalDateTime, Date> {
@Override
public Date convert(LocalDateTime source) {
return source == null ? null : Date.from(source.toInstant(ZoneOffset.UTC));
}
}
最后,您必须覆盖CassandraConfig中的customConversions方法,如下所示:
@Configuration
@EnableCassandraRepositories(basePackages = "my.base.package")
public class CassandraConfig extends AbstractCassandraConfiguration{
@Override
protected String getKeyspaceName() {
return "keyspacename";
}
@Override
public CustomConversions customConversions() {
List<Converter> converters = new ArrayList<>();
converters.add(new DateToLocalDateTime());
converters.add(new LocalDateTimeToDate());
return new CustomConversions(converters);
}
@Bean
public CassandraClusterFactoryBean cluster() {
CassandraClusterFactoryBean cluster =
new CassandraClusterFactoryBean();
cluster.setContactPoints("127.0.0.1");
cluster.setPort(9142);
return cluster;
}
@Bean
public CassandraMappingContext cassandraMapping()
throws ClassNotFoundException {
return new BasicCassandraMappingContext();
}
}
感谢mp911de让我进入了寻找解决方案的棒球场!
内容总结
以上是互联网集市为您收集整理的Apache Cassandra的Spring Data将java.time.LocalDateTime转换为UTC全部内容,希望文章能够帮你解决Apache Cassandra的Spring Data将java.time.LocalDateTime转换为UTC所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。