首页  :: 新随笔  :: 管理

morhia解决BigDecimal映射问题

Posted on 2016-08-21 13:56  季枫  阅读(842)  评论(0编辑  收藏  举报

错误信息: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

智读 | 成都会领科技有限公司官网 | 智读App下载 | 每天听本书的博客 | |