错误信息:morphia No usable constructor for java.math.BigDecimal

解决办法:增加自定义类型转换器,代码如下

  1. package cn.huilink.taozhiyin.mongodb.util;
  2.  
  3. import org.mongodb.morphia.converters.TypeConverter;
  4. import org.mongodb.morphia.mapping.MappedField;
  5. import org.springframework.stereotype.Component;
  6.  
  7. import java.math.BigDecimal;
  8.  
  9. /**
  10. * Created by jifeng on 2016/8/21.
  11. */
  12. @Component("decimalConverter")
  13. public class BigDecimalConverter extends TypeConverter {
  14.  
  15. public BigDecimalConverter() {
  16. super(BigDecimal.class);
  17. }
  18.  
  19. @Override
  20. public Object encode(Object value, MappedField optionalExtraInfo) {
  21. BigDecimal val = (BigDecimal) value;
  22. if (val == null)
  23. return null;
  24. return val.toPlainString();
  25. }
  26.  
  27. @Override
  28. public Object decode(Class targetClass, Object fromDBObject,
  29. MappedField optionalExtraInfo) {
  30. if (fromDBObject == null)
  31. return null;
  32. BigDecimal dec = new BigDecimal(fromDBObject.toString());
  33. return dec;
  34. }
  35.  
  36. }

  

注册类型转换器:

  1. /**
  2. * 自定义类型转换器,通过spring配置注入
  3. */
  4. private List<TypeConverter> typeConverters;
  5.  
  6. Morphia morphia = new Morphia();
  7. //注入类型转换器
  8. if (typeConverters!=null)
  9. for (TypeConverter converters:typeConverters){
  10. morphia.getMapper().getConverters().addConverter(converters);
  11. }

  spring xml注入list

  1. <!--自定义类型转换器-->
  2. <property name="typeConverters">
  3. <list>
  4. <ref bean="decimalConverter"></ref>
  5. </list>
  6. </property>

对映射的实体类BigDecimal进行用注解@Property,否则query会出错,如果分析了结果告知我一下:

java.lang.ClassCastException: java.lang.String cannot be cast to com.mongodb.DBObject

什么原因没有仔细读源码:org.mongodb.morphia.mapping.Mapper

  1. private void readMappedField(final Datastore datastore, final MappedField mf, final Object entity, final EntityCache cache,
  2. final DBObject dbObject) {
  3. if (mf.hasAnnotation(Property.class) || mf.hasAnnotation(Serialized.class)
  4. || mf.isTypeMongoCompatible() || getConverters().hasSimpleValueConverter(mf)) {
  5. opts.getValueMapper().fromDBObject(datastore, dbObject, mf, entity, cache, this);
  6. } else if (mf.hasAnnotation(Embedded.class)) {
  7. opts.getEmbeddedMapper().fromDBObject(datastore, dbObject, mf, entity, cache, this);
  8. } else if (mf.hasAnnotation(Reference.class)) {
  9. opts.getReferenceMapper().fromDBObject(datastore, dbObject, mf, entity, cache, this);
  10. } else {
  11. opts.getDefaultMapper().fromDBObject(datastore, dbObject, mf, entity, cache, this);
  12. }
  13. }

  

  参考资料:

http://stackoverflow.com/questions/24498011/reading-bigdecimal-with-morphia

Mongo的ORM框架的学习Morphia(十一) morphia自定义注脚、转换器的使用 http://www.myexception.cn/open-source/1014326.html

morhia解决BigDecimal映射问题的更多相关文章

  1. 解决tinyint映射成boolean/byte的问题

    前言 最近受疫情的影响,公司要做一个类似一码通的系统为客户服务.由我来进行表的设计.创建表之后需要逆向生成Java的entity.mapper.mapper.xml.由于我在数据库中定义了大量 tin ...

  2. 在进行商业运算时解决BigDecimal的精度丢失问题

    System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.o ...

  3. [刘阳Java]_MyBatis_映射文件的resultMap标签入门_第4讲

    <resultMap>:用于解决实体类中属性和表字段名不相同的问题 id:表示当前<resultMap>标签的唯一标识 result:定义表字段和实体类属性的对应关系 prop ...

  4. 消息映射(C++)(转)

    摘要:控件通知消息有很多种,但是有一种是很常用,但是又不是很容易掌握的,那就是WM_NOTIFY,我试着对此做一下比较全面的论述,有不对的地方,还希望各路大虾批评指正.     控件通知消息     ...

  5. Mybatis实现高级映射一对一、一对多查询

    终于把论文写得差不多了,系统也不急着完成,可以抽出点时间来完成这个系列的博客了.在写本博客之前我是惶恐不安的,高级映射一贯是持久层框架里的重中之重,小到自己开发小系统,大到企业级开发,表的存在从来就不 ...

  6. 图解MFC基本框架(深入消息映射机制)

    首先,先看整体的消息流向图: 上图解释: 起点是消息循环,在winmain函数中(mfc中winmain函数是隐含的调用的,在app全局对象构造完后紧接着调用winmain函数),while循环中不断 ...

  7. BigDecimal 的一点想法

    1.java中会有精度问题,比如: double d1 = 2.0; double d2 = 1.7; System.out.println(d1-d2);//0.30000000000000004 ...

  8. SQL Server 跨网段(跨机房)复制

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考 ...

  9. Neutron 理解 (3): Open vSwitch + GRE/VxLAN 组网 [Netruon Open vSwitch + GRE/VxLAN Virutal Network]

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

随机推荐

  1. wifidog 配置中文说明

    #网关IDGatewayID default#外部网卡ExternalInterface eth0#无线网卡GatewayInterface eth0#无线IPGatewayAddress 192.1 ...

  2. bat脚本 -- 初步接触

    服务器上的Tomcat 经常过一段时间就会死掉,为了防治Tomcat突然当掉影响业务,设置一个定时重启计划. bat脚本如下: @echo restart tomcat6 service, log t ...

  3. C# Enum 简易权限设计 使用FlagsAttribute属性

    基本權限設計: /// <summary> /// 權限列舉 /// </summary> [FlagsAttribute] public enum Permissions { ...

  4. sharepoint Report使用共享数据源部署报错

    在VS中做了一下报表,把数据源设置成为共享数据源,部署时发生以下错误: 解决方法:在VS中解决方案窗口,选择共享数据源中的用到的数据源名称,右键点击,选择“部署”,部署成功后,再部署报表即可.

  5. 一个getjson()方式调用实例【前后台】,适于跨域访问。

    题记:首次发个随笔,把以前写的一个笔记发过来,劝当记录,以供查询. jquery的推出确实解决了大部分程序员都感到头痛的事情,无论是对于UI的访问和处理,还是在一系列的远程访问等方面都有了很大的改善, ...

  6. .htaccess语法中RewriteCond和RewriteRule意义

    今天看了301重定向设置的方法,对网站的首页权重有较重要意义.于是看了别人写的.htaccess文件发现一头雾水,于是查了一些资料来进一步理解. RewriteCond语法 RewriteCond T ...

  7. Android Activity的onSaveInstanceState() 和 onRestoreInstanceState()方法:

    Android Activity的onSaveInstanceState() 和 onRestoreInstanceState()方法: 1. 基本作用: Activity的 onSaveInstan ...

  8. 转: javascript实现全国城市三级联动菜单代码

    <html> <head> <title>js全国城市三级联动菜单代码_B5教程网</title> <meta http-equiv=" ...

  9. linux下用phpize给PHP动态添加扩展

    使用php的常见问题是编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,这里就需要用到phpize了. 如我想增加bcmath扩展的支持,这 ...

  10. 局域网单机部署双tomcat内外网不能访问防火墙问题查出来

    tomcat部署的项目内网访问不了 win7  64 位 控制面板 - 安全 -防火墙-入站规则- 新建规则 选中“端口”按钮,点选“下一步”: 选择“TCP”按钮,在“特定本地端口”输入tomcat ...