首页 文章

MappingInstantiationException与Spring Data Couchbase中的BigInteger字段

提问于
浏览
0

我有一个类型为 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 回答

  • 0

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

    我们在DatesConvertersdates 周围有自定义转换器,但这就是它...

    我们可能会在 Spring Data Mongo 模块中添加一些转换器(如here) . 打开DATACOUCH-234票据来跟踪它 .

    在此期间,您可以使用 AbstractCouchbaseConfiguration 中实例化的 CustomConverters 类来提供自己的转换器 . 最简单的方法是为写入创建 BigInteger -to- String 转换器,然后 String -to- BigInteger 将其读回 .

  • 0

    @Simon,

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

    写入转换器将 BigInteger 存储为String,但由于您没有可用的类型信息,因此没有使用读取转换器读取正确类型的简单方法 .

    在这种情况下,最好的选择是遍历 Map 并“尝试”实例化该数字 .

    您对如何处理此方案有任何其他建议吗?

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

    读取序列化为String的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
    

相关问题