美文网首页
关于mongodb-driver无法解析BigDecimal

关于mongodb-driver无法解析BigDecimal

作者: soSweety | 来源:发表于2018-12-08 14:53 被阅读0次

背景:

springboot项目连接mongoDB数据库,在插入数据到mongDB时报错,异常消息显示没有BigDecimal的Codec。

原因:

跟随异常栈发现MongoDBDriver在转化数据是会从一个Codec注册表中获取相应java类的的Codec,然后重启项目跟随代码发现Codec注册表初始化时并没有添加BigDecimal的Codec,同时也没有BigDecimal的Codec

解决:

首先是实现Codec 创建 BigDecimal 的Codec:

public class MongoBigCodec implements Codec {

@Override

    public BigDecimaldecode(BsonReader bsonReader, DecoderContext decoderContext) {

            return new BigDecimal(bsonReader.readString());

    }

@Override

    public void encode(BsonWriter bsonWriter, BigDecimal bigDecimal, EncoderContext encoderContext) {

         bsonWriter.writeString(bigDecimal.toString());

    }

@Override

    public ClassgetEncoderClass() {  

             return BigDecimal.class;

    }

}

接着在spring初始化时,利用发射将实现的MongoBigCodec添加到Codec注册表:

@Component

public class MongoInitimplements CommandLineRunner {

@Autowired

    private MongoTemplatemongoTemplate;

    @Override

    public void run(String... strings)throws Exception {

Class clazz = (Class) (mongoTemplate.getDb().getMongo()).getClass();

        Field f = clazz.getDeclaredField("DEFAULT_CODEC_REGISTRY");

        f.setAccessible(true);

        CodecRegistry codecRegistry = (CodecRegistry) f.get(mongoTemplate.getDb().getMongo());

        Field cf = codecRegistry.getClass().getDeclaredField("codecProviders");

        cf.setAccessible(true);

        ValueCodecProvider codecProvider = (ValueCodecProvider) ((ArrayList) cf.get(codecRegistry)).get(0);

        Method[] putCs = codecProvider.getClass().getDeclaredMethods();

        Method putC =null;

        for (int i =0; i < putCs.length; i++) {

if (putCs[i].getName().equals("addCodec")) {

putC = putCs[i];

break;

            }

}

putC.setAccessible(true);

        putC.invoke(codecProvider, new MongoBigCodec());

    }

}

再次重启项目,程序能够正常的解析BigDecimal数据类型

相关文章

  • 关于mongodb-driver无法解析BigDecimal

    背景: springboot项目连接mongoDB数据库,在插入数据到mongDB时报错,异常消息显示没有BigD...

  • 奇奇怪怪的BUG

    Double类型数据 初始化BigDecimal 使用Double作为参数构造BigDecimal对象,无法精确构...

  • 关于BigDecimal

    我们都知道,在java中浮点数由double与float表示,他们在计算的时候会出现精度问题,比如 我们期望得到的...

  • 关于 BigDecimal

    商业计算一定要用BigDecimal 加减乘除都可 不能整除抛出异常 参数类型为double的构造方法的结果有一定...

  • 关于BigDecimal

    使用double和float计算时会造成精度丢失的问题 要进行计算要用BigDecimalBigdecimal a...

  • BigDecimal的详细解析

    前言 float和double设计的目的是为了科学计算和工程计算. 它提供在广域数值范围上较为精确的快速计算. 然...

  • BigDecimal运算详细解析

    float和double设计的目的是为了科学计算和工程计算. 它提供在广域数值范围上较为精确的快速计算. 然而,它...

  • Java小数点处理

    四种方法 1. BigDecimal类 BigDecimal bigDecimal =new BigDecimal...

  • 从源码的角度分析BigDecimal 初始化报错

    报错信息 项目Gosn 解析报错,报错信息如下。 仔细找了下发现是 BigDecimal 报出的错误,下面BigD...

  • BigDecimal 判断相等

    BigDecimal hundred = new BigDecimal("100");BigDecimal zer...

网友评论

      本文标题:关于mongodb-driver无法解析BigDecimal

      本文链接:https://www.haomeiwen.com/subject/blawcqtx.html