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

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

package cn.huilink.taozhiyin.mongodb.util;

import org.mongodb.morphia.converters.TypeConverter;
import org.mongodb.morphia.mapping.MappedField;
import org.springframework.stereotype.Component; import java.math.BigDecimal; /**
* Created by jifeng on 2016/8/21.
*/
@Component("decimalConverter")
public class BigDecimalConverter extends TypeConverter { public BigDecimalConverter() {
super(BigDecimal.class);
} @Override
public Object encode(Object value, MappedField optionalExtraInfo) {
BigDecimal val = (BigDecimal) value;
if (val == null)
return null;
return val.toPlainString();
} @Override
public Object decode(Class targetClass, Object fromDBObject,
MappedField optionalExtraInfo) {
if (fromDBObject == null)
return null;
BigDecimal dec = new BigDecimal(fromDBObject.toString());
return dec;
} }

  

注册类型转换器:

    /**
* 自定义类型转换器,通过spring配置注入
*/
private List<TypeConverter> typeConverters; Morphia morphia = new Morphia();
//注入类型转换器
if (typeConverters!=null)
for (TypeConverter converters:typeConverters){
morphia.getMapper().getConverters().addConverter(converters);
}

  spring xml注入list

        <!--自定义类型转换器-->
<property name="typeConverters">
<list>
<ref bean="decimalConverter"></ref>
</list>
</property>

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

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

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

    private void readMappedField(final Datastore datastore, final MappedField mf, final Object entity, final EntityCache cache,
final DBObject dbObject) {
if (mf.hasAnnotation(Property.class) || mf.hasAnnotation(Serialized.class)
|| mf.isTypeMongoCompatible() || getConverters().hasSimpleValueConverter(mf)) {
opts.getValueMapper().fromDBObject(datastore, dbObject, mf, entity, cache, this);
} else if (mf.hasAnnotation(Embedded.class)) {
opts.getEmbeddedMapper().fromDBObject(datastore, dbObject, mf, entity, cache, this);
} else if (mf.hasAnnotation(Reference.class)) {
opts.getReferenceMapper().fromDBObject(datastore, dbObject, mf, entity, cache, this);
} else {
opts.getDefaultMapper().fromDBObject(datastore, dbObject, mf, entity, cache, this);
}
}

  

  参考资料:

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. angular router-ui

    将模块注入到控制器中的方法: 1.export module 2.在router中resolve解决: 2.1 resolve中直接return值 /*ngInject*/ worker : 'hi' ...

  2. linux 环境变量PATH路径的三种方法

    转:http://www.jb51.net/LINUXjishu/150167.html 总结:修改1.#PATH=$PATH:/etc/apache/bin  或者#vi /etc/profile ...

  3. easyui-textbox 和 easyui-validatebox 设置值和获取值

    表单作如下定义:该input使用easyui的"easyui-textbox" <input id="addSnumber" style="wi ...

  4. 使用scp将文件/目录拷贝到另一台Linux主机上

    如何将一台Linux主机上的文件或目录拷贝到另一台Linux主机上,scp命令可以实现该需求 前提条件:两台Linux主机处于同一网段,可以互相ping通 操作如下: 文件拷贝 ①将本地文件拷贝到远端 ...

  5. foundation框架—结构体

    Foundation框架—结构体 一.基本知识 Foundation—基础框架.框架中包含了很多开发中常用的数据类型,如结构体,枚举,类等,是其他ios框架的基础. 如果要想使用foundation框 ...

  6. sql like in 语句获取以逗号分割的字段内的数据

    From:http://www.cnblogs.com/goody9807/archive/2011/07/27/2118107.html sql中的某个字段用“,”分隔数据,需要获取数据的时候直接把 ...

  7. Rhel6-torque作业调度系统配置文档

    系统环境: rhel6 x86_64 iptables and selinux disabled 主机: 192.168.122.121 server21.example.com 计算节点 192.1 ...

  8. Linux定时器相关源码分析

    Linux的定时器使用时间轮算法.数据结构不难理解,核心数据结构与散列表及其相似,甚至可以说,就是散列表.事实上,理解其散列表的本质,有助于对相关操作的理解. 数据结构 这里先列出一些宏,稍后解释: ...

  9. QT中QWS的含义 (转至 宋金时的专栏

    QT 编程和文档中的术语QWS的全称是Qt windows system,是QT自行开发的窗口系统,体系结构类似X Windows,是一个C/S结构,由QWS Server在物理设备上显示,由QWS ...

  10. Python框架、库以及软件资源汇总

    转自:http://developer.51cto.com/art/201507/483510.htm 很多来自世界各地的程序员不求回报的写代码为别人造轮子.贡献代码.开发框架.开放源代码使得分散在世 ...