用Morphia读BigDecimal

时间:2014-06-30 19:57:09

标签: java mongodb morphia

我有一个使用BigDecimal的POJO。当我将对象保存到morphia时,很明显该值保存为字符串。但是,如果我从javascript shell修改数据库以获得一些十进制数值,尝试使用morphia类读取对象,它失败并出现以下错误:

例如:

@Entity(value = "table_name", noClassnameStored = true)
public class Advertisement implements Table {
  BigDecimal value;
}

java.lang.ArrayStoreException
    at java.lang.System.arraycopy(Native Method)
    at java.util.ArrayList.toArray(ArrayList.java:361)
    at org.mongodb.morphia.utils.ReflectionUtils.convertToArray(ReflectionUtils.java:537)
    at org.mongodb.morphia.converters.IntegerConverter.decode(IntegerConverter.java:35)
    at org.mongodb.morphia.converters.DefaultConverters.fromDBObject(DefaultConverters.java:134)
    at org.mongodb.morphia.mapping.ValueMapper.fromDBObject(ValueMapper.java:27)
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:604)
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:585)
    at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:296)
    at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:78)
    at org.mongodb.morphia.query.MorphiaIterator.processItem(MorphiaIterator.java:65)
    at org.mongodb.morphia.query.MorphiaIterator.next(MorphiaIterator.java:60)
    at org.mongodb.morphia.query.QueryImpl.asList(QueryImpl.java:294)
    at 
...

将字符串形式的十进制值添加到mongodb的正确形式是什么,以便morphia可以将该值读入Java BigDecimal?

2 个答案:

答案 0 :(得分:2)

正如@evanchooly引用的那样,我已经有了BigDecimal代码,可以使用Morphia中的对象代码。这是代码:

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;
}

}

直到最近我创建了一个新的POJO集合。

奇怪的是,解决方法是对变量使用@Property()注释。而不是允许morphia命名密钥。

答案 1 :(得分:0)

您可以在mailing list上看到有关此问题的讨论,并提供一些建议的解决方案。