解决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

BigDecimal总结

BigDecimal 精准加减乘除

bigdecimal去除末尾多余的0 ,stripTrailingZeros()科学计数法解决

java 中使用BigDecimal 解决科学计数法问题

BigDecimal的String类型