• 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

  • 相关阅读:
    关于maven下载速度慢,下载完的依赖包不知去向的应对措施
    进一步解析二分搜索树的实现
    mysql语法建库建表综合整理是示例
    走进二分搜索树的第一课
    优先队列和堆
    window系统mysql安装后获取默认密码
    微信小程序中使用云开发获取openid
    使用IDEA将springboot框架导入的两种方法
    C/C++、Qt4实现FTP客户端(有无界面版)
    云服务器搭建代理服务器 —— 某sock ,简单说明
  • 原文地址:https://www.cnblogs.com/jifeng/p/5792639.html
Copyright © 2020-2023  润新知