java - Spring & Couchbase - 没有找到能够从类型 [java.lang.Long] 转换为类型 [java.sql.Timestamp] 的转换器
问题描述
我们有一个文档保存到 Couchbase 数据库中。它有一个时间戳字段:
@Document
class Cat{
@Id
@GeneratedValue(strategy = GenerationStrategy.UNIQUE)
private String id;
@Field
Timestamp birthdateTimestamp;
创建 Cat 时,我们可以将数据保存到字段中:
Timestamp currentTimestamp = new Timestamp(new Date().getTime());
Cat cat = Cat.builder().birthdateTimestamp(currentTimestamp).build();
catRepository.save(cat); // extends CouchbaseRepository<Cat, String>
并且可以在数据库中正确看到该字段 -"birthdateTimestamp": 1564570366644
但是,当尝试Cat
从数据库中读取时,我们会收到此错误:
org.springframework.core.convert.ConverterNotFoundException:找不到能够从类型 [java.lang.Long] 转换为类型 [java.sql.Timestamp]] 的转换器,根本原因是 org.springframework.core.convert.ConverterNotFoundException:没有转换器在 org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:321) 中发现能够从类型 [java.lang.Long] 转换为类型 [java.sql.Timestamp]。 convert.support.GenericConversionService.convert(GenericConversionService.java:194) 在 org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:174) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter。 org.readValue(MappingCouchbaseConverter.java:804)springframework.data.couchbase.core.convert.MappingCouchbaseConverter.access$400(MappingCouchbaseConverter.java:77) at org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter$CouchbasePropertyValueProvider.getPropertyValue(MappingCouchbaseConverter.java:869) at org.springframework .data.couchbase.core.convert.MappingCouchbaseConverter$CouchbasePropertyValueProvider.getPropertyValue(MappingCouchbaseConverter.java:824) 在 org.springframework.data.mapping.model.PersistentEntityParameterValueProvider.getParameterValue(PersistentEntityParameterValueProvider.java:71) 在 org.springframework.data.mapping .model.SpELExpressionParameterValueProvider.getParameterValue(SpELExpressionParameterValueProvider.java:49) 在 org.springframework.data.convert.ClassGeneratingEntityInstantiator$EntityInstantiatorAdapter。extractInvocationArguments(ClassGeneratingEntityInstantiator.java:248) at org.springframework.data.convert.ClassGeneratingEntityInstantiator$EntityInstantiatorAdapter.createInstance(ClassGeneratingEntityInstantiator.java:221) at org.springframework.data.convert.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:86) at org .springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:236) at org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:213) at org.springframework.data .couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:171) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:77) 在 org.springframework.data.couchbase.core.CouchbaseTemplate.findByN1QL(CouchbaseTemplate.java:448) 在 org.springframework.data 的 org.springframework.data.couchbase.core.CouchbaseTemplate.mapToEntity(CouchbaseTemplate.java:700) .couchbase.repository.query.AbstractN1qlBasedQuery.executeCollection(AbstractN1qlBasedQuery.java:156) 在 org.springframework.data.couchbase.repository.query.AbstractN1qlBasedQuery.executeEntity(AbstractN1qlBasedQuery.java:162) 在 org.springframework.data.couchbase.repository .query.AbstractN1qlBasedQuery.executeDependingOnType(AbstractN1qlBasedQuery.java:135) 在 org.springframework.data.couchbase.repository.query.AbstractN1qlBasedQuery.execute(AbstractN1qlBasedQuery.java:106) 在 org.springframework.data.repository.core.support。RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:590) at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:578) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed( ReflectiveMethodInvocation.java:185) at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:59) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.data .couchbase.repository.support.ViewPostProcessor$ViewInterceptor.invoke(ViewPostProcessor.java:87) 在 org.springframework.aop.framework.ReflectiveMethodInvocation。在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) 在 org.springframework. .aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke (SurroundingTransactionDetectorMethodInterceptor.java:61) 在 org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) 在 org.springframework.aop.framework.JdkDynamicAopProxy。在 com.sun.proxy.$Proxy130.findByCustomerNameAndProjectName 调用(JdkDynamicAopProxy.java:212)(未知来源)
我们做错了什么?
解决方案
看起来该值以 Epoch 格式存储在数据库中。
与其尝试将纪元直接转换为 sql Timestamp,不如将其存储为 long,即
@Field
long birthdateTimestamp;
然后要将 epoch 格式转换为 sql Timestamp,您可以使用以下内容。
new Timestamp(object.getBirthdateTimestamp())
推荐阅读
- android - 可能的未处理承诺拒绝(id:9):TypeError:React Native 上的网络请求失败
- r - R - 根据多个条件和事件时间创建新列
- react-native-elements - 使用 react-native-elements 反应原生 - 警告 => 'ListItem.title' 属性已被弃用,将在下一个版本中删除
- reactjs - 从反应选择下拉列表中删除或隐藏选项
- c++ - 如何使用cmake编译用dpdk用C和C++编写的项目
- sql - 如何安全地删除/删除表?
- jquery - 是否可以通过样式表或 JavaScript 明确设置元素的高度?
- javascript - VueJs 如何从 api 调用或 html 文件加载 html?
- r - 如何使用 cat 函数输出符合约束的元素?
- time-complexity - 如何计算这些排列组合算法的时间复杂度?