morhia解决BigDecimal映射问题
错误信息: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映射问题的更多相关文章
- 解决tinyint映射成boolean/byte的问题
前言 最近受疫情的影响,公司要做一个类似一码通的系统为客户服务.由我来进行表的设计.创建表之后需要逆向生成Java的entity.mapper.mapper.xml.由于我在数据库中定义了大量 tin ...
- 在进行商业运算时解决BigDecimal的精度丢失问题
System.out.println(0.05+0.01); System.out.println(1.0-0.42); System.out.println(4.015*100); System.o ...
- [刘阳Java]_MyBatis_映射文件的resultMap标签入门_第4讲
<resultMap>:用于解决实体类中属性和表字段名不相同的问题 id:表示当前<resultMap>标签的唯一标识 result:定义表字段和实体类属性的对应关系 prop ...
- 消息映射(C++)(转)
摘要:控件通知消息有很多种,但是有一种是很常用,但是又不是很容易掌握的,那就是WM_NOTIFY,我试着对此做一下比较全面的论述,有不对的地方,还希望各路大虾批评指正. 控件通知消息 ...
- Mybatis实现高级映射一对一、一对多查询
终于把论文写得差不多了,系统也不急着完成,可以抽出点时间来完成这个系列的博客了.在写本博客之前我是惶恐不安的,高级映射一贯是持久层框架里的重中之重,小到自己开发小系统,大到企业级开发,表的存在从来就不 ...
- 图解MFC基本框架(深入消息映射机制)
首先,先看整体的消息流向图: 上图解释: 起点是消息循环,在winmain函数中(mfc中winmain函数是隐含的调用的,在app全局对象构造完后紧接着调用winmain函数),while循环中不断 ...
- BigDecimal 的一点想法
1.java中会有精度问题,比如: double d1 = 2.0; double d2 = 1.7; System.out.println(d1-d2);//0.30000000000000004 ...
- SQL Server 跨网段(跨机房)复制
一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 解决方案(Solution) 搭建过程(Process) 注意事项(Attention) 参考 ...
- Neutron 理解 (3): Open vSwitch + GRE/VxLAN 组网 [Netruon Open vSwitch + GRE/VxLAN Virutal Network]
学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...
随机推荐
- git drupal eclipse
eclispe如何打补丁https://www.drupal.org/patch/apply打patch,初级详细教程https://www.drupal.org/node/620014
- Android API 21 Toolbar Padding
up vote117down votefavorite 44 How do I get rid of the extra padding in the new Toolbar with Android ...
- Spring中映射Mongodb中注解的解释
spring-data-mongodb中的实体映射是通过MongoMappingConverter这个类实现的.它可以通过注释把java类转换为mongodb的文档. 它有以下几种注释: @Id - ...
- 【bzoj1098】办公楼
[bzoj1098]办公楼 题意 FGD开办了一家电话公司.他雇用了N个职员,给了每个职员一部手机.每个职员的手机里都存储有一些同事的电话号码.由于FGD的公司规模不断扩大,旧的办公楼已经显得十分狭窄 ...
- C#日常总结1
Rows:行的集合: Columns:列的集合: Gridview:用来显示数据的表格{ //设置 AutoGenerateColumns="false":表示不允许自动产生列,列 ...
- JS重要知识点
这里列出了一些JS重要知识点(不全面,但自己感觉很重要).彻底理解并掌握这些知识点,对于每个想要深入学习JS的朋友应该都是必须的. 讲解还是以示例代码搭配注释的形式,这里做个小目录: JS代码预解析原 ...
- 关于strcpy和memcpy
strcpy和memcpy都是标准C库函数,它们有下面的特点. strcpy提供了字符串的复制.即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符.已知strcpy函 ...
- JavaScript的sleep延时函数
JavaScript没有像Java的sleep延时函数,所以记录JavaScript的sleep延时函数 function sleep(milliSeconds) { var startTime = ...
- iOS开发UI篇—Quartz2D使用(信纸条纹)
iOS开发UI篇—Quartz2D使用(信纸条纹) 一.前导程序 新建一个项目,在主控制器文件中实现以下几行代码,就能轻松的完成图片在视图中的平铺. #import "YYViewContr ...
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...