错误信息: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
浙公网安备 33010602011771号