我有一个类型为 java.math.BigInteger
的字段的实体
public class MyEntity {
private String id;
private BigInteger max;
}
使用Spring Data JPA将实体存储在DB中没有任何问题;但是当我检索实体时,我得到以下异常
org.springframework.data.mapping.model.MappingInstantiationException:无法使用带参数的构造函数NO_CONSTRUCTOR实例化java.math.BigInteger
BigInteger
没有无参数构造函数 . 那是问题吗?有什么方法可以解决这个问题吗?
我正在使用spring数据couchbase,完整的堆栈跟踪如下所示
org.springframework.data.mapping.model.MappingInstantiationException:无法使用构造NO_CONSTRUCTOR与org.springframework在org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:64)参数来实例java.math.BigInteger中 . data.convert.ClassGeneratingEntityInstantiator.createInstance(ClassGeneratingEntityInstantiator.java:83)在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:203)在org.springframework.data.couchbase.core.convert . MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:185)在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.readValue(MappingCouchbaseConverter.java:725)在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.access $ 200 (MappingCouchbaseConverter.java:65)位于org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter $ CouchbasePropertyValueProvider.g etPropertyValue(在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter $ 1.doWithPersistentProperty(MappingCouchbaseConverter)的org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.getValueInternal(MappingCouchbaseConverter.java:243)中的mapsCouchbaseConverter.java:78) . 的java:212)在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter $ 1.doWithPersistentProperty(MappingCouchbaseConverter.java:206)在org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:310)在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:206)在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:185)在org.springframework . org.springframework.data.couchbase.core.convert.MappingCouchbaseConver中的data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:140) ter.read(MappingCouchbaseConverter.java:65)在org.springframework.data.couchbase.core.CouchbaseTemplate.mapToEntity(CouchbaseTemplate.java:606)在org.springframework.data.couchbase.core.CouchbaseTemplate.findById(CouchbaseTemplate.java: 298)org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java:104)
2 回答
你是对的,Spring Data Couchbase中没有
BigInteger
的默认转换器:(我们在DatesConverters的
dates
周围有自定义转换器,但这就是它...我们可能会在
Spring Data Mongo
模块中添加一些转换器(如here) . 打开DATACOUCH-234票据来跟踪它 .在此期间,您可以使用
AbstractCouchbaseConfiguration
中实例化的CustomConverters
类来提供自己的转换器 . 最简单的方法是为写入创建BigInteger
-to-String
转换器,然后String
-to-BigInteger
将其读回 .@Simon,
当
BigInteger
类型被定义为您要存储的实体的成员时(例如在原始问题中),转换器变通方法将正常工作,但考虑实体包含Map<String, Object>
的情况,其中包含BigInteger
.写入转换器将
BigInteger
存储为String,但由于您没有可用的类型信息,因此没有使用读取转换器读取正确类型的简单方法 .在这种情况下,最好的选择是遍历 Map 并“尝试”实例化该数字 .
您对如何处理此方案有任何其他建议吗?
另外我不明白为什么不支持存储这些数据类型 . 根据我的理解,不是Couchbase问题,而是SDK / Spring Data限制 .
读取序列化为String的JSON对象,该对象定义了一个“大数字”,支持到带有Jackson的Map,并且它正确地将该字段映射到正确的类型 .