解决mongodb中BigDecimal和Decimal128互转异常
Posted 李泰山
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决mongodb中BigDecimal和Decimal128互转异常相关的知识,希望对你有一定的参考价值。
java 对象的使用BigDecimal 存入mongodb 时候,需要将BigDecimal 转成Decimal128 格式存储,
从mongodb中读取数据时候,需要将Decimal128转成BigDecimal 格式读取,否则就会报以下异常。
查询时异常
No converter found capable of converting from type [org.bson.types.Decimal128] to type [java.math.BigDecimal]
保存,修改时异常
Conversion to Decimal128 would require inexact rounding of -819293.82559555
解决异常方案
配置mongo类型转换器
写入转换器
package org.springblade.workface.config;
import org.bson.types.Decimal128;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.WritingConverter;
import java.math.BigDecimal;
/**
* java-->mongo 即BigDecimal变为Decimal128的转换器
*/
@WritingConverter
public class BigDecimalToDecimal128Converter implements Converter<BigDecimal, Decimal128>
@Override
public Decimal128 convert(BigDecimal bigDecimal)
return new Decimal128(BigDecimal.valueOf(bigDecimal.doubleValue()));
BigDecimal.valueOf(bigDecimal.doubleValue())
防止 BigDecimal 是防止 值过长导致转换失败
读取转换器
package org.springblade.workface.config;
import org.bson.types.Decimal128;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import java.math.BigDecimal;
/**
* mongo--->java 即Decimal128变为BigDecimal的转换器
*/
@ReadingConverter
public class Decimal128ToBigDecimalConverter implements Converter<Decimal128, BigDecimal>
@Override
public BigDecimal convert(Decimal128 decimal128)
return decimal128.bigDecimalValue();
配置类代码
package org.springblade.workface.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class MongoConvertConfig
/**
* mongoCustomConversions会由spring进行管理,
* 按照加入的转换器,在数据库读写时对数据类型进行转换
*
* @return
*/
@Bean
public MongoCustomConversions mongoCustomConversions()
List<Converter<?, ?>> converterList = new ArrayList<>();
converterList.add(new BigDecimalToDecimal128Converter());
converterList.add(new Decimal128ToBigDecimalConverter());
return new MongoCustomConversions(converterList);
配置完毕,重启测试。
以上是关于解决mongodb中BigDecimal和Decimal128互转异常的主要内容,如果未能解决你的问题,请参考以下文章
1689. Partitioning Into Minimum Number Of Deci-Binary Numbers