1

我有一个类型为字段的实体java.math.BigInteger

public class MyEntity {
  private String id;
  private BigInteger max;
}

使用 Spring Data JPA 将实体存储在数据库中没有任何问题;但是当我检索实体时,出现以下异常

org.springframework.data.mapping.model.MappingInstantiationException:无法使用带参数的构造函数 NO_CONSTRUCTOR 实例化 java.math.BigInteger

BigInteger没有无参数构造函数。那是问题吗?有没有办法解决这个问题?

我正在使用spring data couchbase,完整的堆栈跟踪如下

org.springframework.data.mapping.model.MappingInstantiationException:无法使用构造函数 NO_CONSTRUCTOR 实例化 java.math.BigInteger,其参数位于 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 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.readValue(MappingCouchbaseConverter.java:725) 上的 .read(MappingCouchbaseConverter.java:185)。couchbase.core.convert.MappingCouchbaseConverter.access $200(MappingCouchbaseConverter.java:65) at org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter$CouchbasePropertyValueProvider.getPropertyValue(MappingCouchbaseConverter.java:78 at org.springframework.data.couchbase。 core.convert.MappingCouchbaseConverter.getValueInternal(MappingCouchbaseConverter.java:243) at org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter$1.doWithPersistentProperty(MappingCouchbaseConverter.java:212) at 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) at org.springframework.data.couchbase.core.CouchbaseTemplate.findById(CouchbaseTemplate.java:298) at org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java: 104)convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:206) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:185) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter。在 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)convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:206) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:185) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter。在 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)在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:185) 处读取(MappingCouchbaseConverter.java:206) java:140) at org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:65) at org.springframework.data.couchbase.core.CouchbaseTemplate.mapToEntity(CouchbaseTemplate.java:606) at org .springframework.data.couchbase.core.CouchbaseTemplate.findById(CouchbaseTemplate.java:298) at org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java:104)在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:185) 处读取(MappingCouchbaseConverter.java:206) java:140) at org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:65) at org.springframework.data.couchbase.core.CouchbaseTemplate.mapToEntity(CouchbaseTemplate.java:606) at org .springframework.data.couchbase.core.CouchbaseTemplate.findById(CouchbaseTemplate.java:298) at org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java:104)convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:185) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:140) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter。在 org.springframework.data.couchbase.core.CouchbaseTemplate.findById(CouchbaseTemplate.java:298) 的 org.springframework.data.couchbase.core.CouchbaseTemplate.mapToEntity(CouchbaseTemplate.java:606) 处读取(MappingCouchbaseConverter.java:65)在 org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java:104)convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:185) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter.read(MappingCouchbaseConverter.java:140) 在 org.springframework.data.couchbase.core.convert.MappingCouchbaseConverter。在 org.springframework.data.couchbase.core.CouchbaseTemplate.findById(CouchbaseTemplate.java:298) 的 org.springframework.data.couchbase.core.CouchbaseTemplate.mapToEntity(CouchbaseTemplate.java:606) 处读取(MappingCouchbaseConverter.java:65)在 org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java:104)在 org.springframework.data.couchbase.core.CouchbaseTemplate.mapToEntity(CouchbaseTemplate.java: 606) 在 org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java:104) 的 org.springframework.data.couchbase.core.CouchbaseTemplate.findById(CouchbaseTemplate.java:298)在 org.springframework.data.couchbase.core.CouchbaseTemplate.mapToEntity(CouchbaseTemplate.java: 606) 在 org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java:104) 的 org.springframework.data.couchbase.core.CouchbaseTemplate.findById(CouchbaseTemplate.java:298)findById(CouchbaseTemplate.java:298) 在 org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java:104)findById(CouchbaseTemplate.java:298) 在 org.springframework.data.couchbase.repository.support.SimpleCouchbaseRepository.findOne(SimpleCouchbaseRepository.java:104)

4

2 回答 2

0

BigInteger你是对的, Spring Data Couchbase中没有默认转换器:(

我们datesDatesConverters中有自定义转换器,但仅此而已......

我们可能会在与Spring Data Mongo模块相同的行中添加一些转换器(如这里)。打开DATACOUCH-234票来跟踪它。

同时,您可以使用CustomConverters实例化的类AbstractCouchbaseConfiguration来提供您自己的转换器。最简单的方法是制作一个用于BigInteger写入的String转换器,然后将其StringBigInteger回。

于 2016-06-07T14:36:38.423 回答
0

@西蒙,

BigInteger类型被定义为您要存储的实体的成员时(如在原始问题中),转换器解决方法将正常工作,但请考虑实体包含 a 的情况,Map<String, Object>其中包含 a BigInteger

写入转换器将存储BigInteger为字符串,但没有简单的方法可以使用读取转换器读取正确的类型,因为您不再有可用的类型信息。

在这种情况下,最好的办法是遍历地图并“尝试”实例化数字。

您对如何处理这种情况有任何其他建议吗?

另外我不明白为什么不支持存储这些数据类型。据我了解,这不是 Couchbase 问题,而是 SDK/Spring 数据限制。

支持将序列化为定义“大数字”的字符串的 JSON 对象读取到带有 Jackson 的 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
于 2016-09-25T07:16:00.120 回答