使用Spring Data Couchbase中的BigInteger字段进行MappingInstantiationException

时间:2016-06-07 05:19:18

标签: java couchbase biginteger spring-data-couchbase

我的实体的字段类型为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)

2 个答案:

答案 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