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 ...
随机推荐
- wifidog 配置中文说明
#网关IDGatewayID default#外部网卡ExternalInterface eth0#无线网卡GatewayInterface eth0#无线IPGatewayAddress 192.1 ...
- bat脚本 -- 初步接触
服务器上的Tomcat 经常过一段时间就会死掉,为了防治Tomcat突然当掉影响业务,设置一个定时重启计划. bat脚本如下: @echo restart tomcat6 service, log t ...
- C# Enum 简易权限设计 使用FlagsAttribute属性
基本權限設計: /// <summary> /// 權限列舉 /// </summary> [FlagsAttribute] public enum Permissions { ...
- sharepoint Report使用共享数据源部署报错
在VS中做了一下报表,把数据源设置成为共享数据源,部署时发生以下错误: 解决方法:在VS中解决方案窗口,选择共享数据源中的用到的数据源名称,右键点击,选择“部署”,部署成功后,再部署报表即可.
- 一个getjson()方式调用实例【前后台】,适于跨域访问。
题记:首次发个随笔,把以前写的一个笔记发过来,劝当记录,以供查询. jquery的推出确实解决了大部分程序员都感到头痛的事情,无论是对于UI的访问和处理,还是在一系列的远程访问等方面都有了很大的改善, ...
- .htaccess语法中RewriteCond和RewriteRule意义
今天看了301重定向设置的方法,对网站的首页权重有较重要意义.于是看了别人写的.htaccess文件发现一头雾水,于是查了一些资料来进一步理解. RewriteCond语法 RewriteCond T ...
- Android Activity的onSaveInstanceState() 和 onRestoreInstanceState()方法:
Android Activity的onSaveInstanceState() 和 onRestoreInstanceState()方法: 1. 基本作用: Activity的 onSaveInstan ...
- 转: javascript实现全国城市三级联动菜单代码
<html> <head> <title>js全国城市三级联动菜单代码_B5教程网</title> <meta http-equiv=" ...
- linux下用phpize给PHP动态添加扩展
使用php的常见问题是编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,这里就需要用到phpize了. 如我想增加bcmath扩展的支持,这 ...
- 局域网单机部署双tomcat内外网不能访问防火墙问题查出来
tomcat部署的项目内网访问不了 win7 64 位 控制面板 - 安全 -防火墙-入站规则- 新建规则 选中“端口”按钮,点选“下一步”: 选择“TCP”按钮,在“特定本地端口”输入tomcat ...