zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    剑指Offer-30.连续子数组的最大和(C++/Java)
    剑指Offer-29.最小的K个数(C++/Java)
    UVA 1616 Caravan Robbers 商队抢劫者(二分)
    UVA 10570 Meeting with Aliens 外星人聚会
    UVA 11093 Just Finish it up 环形跑道 (贪心)
    UVA 12673 Erratic Expansion 奇怪的气球膨胀 (递推)
    UVA 10954 Add All 全部相加 (Huffman编码)
    UVA 714 Copying Books 抄书 (二分)
    UVALive 3523 Knights of the Round Table 圆桌骑士 (无向图点双连通分量)
    codeforecs Gym 100286B Blind Walk
  • 原文地址:https://www.cnblogs.com/jifeng/p/5792639.html
Copyright © 2011-2022 走看看