我的实体的字段类型为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数据库,完整的堆栈跟踪如下所示
org.springframework.data.mapping.model.MappingInstantiationException: 无法使用构造函数实例化java.math.BigInteger 带参数的NO_CONSTRUCTOR 在org.springframework.data.convert.ReflectionEntityInstantiator.createInstance(ReflectionEntityInstantiator.java:64) 在org.springframework.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.getPropertyValue(MappingCouchbaseConverter.java:78 在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.getValueInternal(MappingCouchbaseConverter.java:243) 在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter $ 1.doWithPersistentProperty(MappingCouchbaseConverter.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.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:140) 在org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.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)
答案 0 :(得分:0)
你是对的,Spring Data Couchbase中没有BigInteger
的默认转换器:(
我们在DatesConverters dates
周围有Spring Data Mongo
的自定义转换器,但是关于它......
我们可能会在CustomConverters
模块中添加一些转换器(如here)。打开DATACOUCH-234票证进行跟踪。
与此同时,您可以使用AbstractCouchbaseConfiguration
中实例化的BigInteger
类来提供自己的转换器。最简单的方法是为写入设置String
到 - String
转换器,然后BigInteger
- 到 - proc sql
将其读回。
答案 1 :(得分:0)
@Simon,
当BigInteger
类型被定义为您要存储的实体的成员时,转换器解决方法将正常工作
(就像在原始问题中一样),但考虑实体包含Map<String, Object>
的情况
BigInteger
。
写入转换器将BigInteger
存储为String,但没有简单的方法来读取正确的
因为您不再提供类型信息,请使用读取转换器键入。
在这种情况下,最好的选择是遍历地图,然后尝试&#34;实例化数字。
您对如何处理此方案有任何其他建议吗?
另外,我不明白为什么不支持存储这些数据类型。根据我的理解,不是Couchbase问题 但SDK / Spring数据限制。
读取序列化为String的JSON对象,该对象将一个&#34;大数字&#34;,定义为一个Map 支持杰克逊,它正确地将字段映射到正确的类型。
String json = "{\"bignumber\": 12345678901234567890}";
ObjectMapper om = new ObjectMapper();
Map<String, Object> map = om.readValue(json, Map.class);
System.out.println(map.get("bignumber") instanceof BigInteger); // True