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