Morphia ArrayStoreException BigDecimal和Integer Array

时间:2014-07-25 05:48:25

标签: java morphia

检索文档时,我得到以下堆栈跟踪。 该文档有一个BigDecimal字段,在调试器上运行时似乎可以成功解析。但是,程序在解析五个整数的数组时崩溃。

我注意到BigDecimal的使用,因为还有其他帖子提到了BigDecimal和ArrayStoreException。

此错误似乎表明数组正在解析为List。

如果我从Java代码编写POJO,则永远不会看到错误。

但是,如果我将BigDecimal添加为字符串,则会显示此错误。

如何解决此问题?

Exception in thread "main" 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:538)
at org.mongodb.morphia.converters.IntegerConverter.decode(IntegerConverter.java:35)
at org.mongodb.morphia.converters.DefaultConverters.fromDBObject(DefaultConverters.java:133)
at org.mongodb.morphia.mapping.ValueMapper.fromDBObject(ValueMapper.java:27)
at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:601)
at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:582)
at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:292)
at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:79)
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:305)

这是我用于BigDecimal的TypeConverter

public class BigDecimalConverter extends TypeConverter  implements SimpleValueConverter{

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类是

@Entity(value = "a_table", noClassnameStored = true)

public class MorphiaArrayObject {     @ID     ObjectId Id;

@Property("ratings")
Integer[] ratings;

@Property("money")
BigDecimal money;

public ObjectId getId() {
    return Id;
}

public MorphiaArrayObject setId(ObjectId id) {
    Id = id;
    return this;
}

public Integer[] getRatings() {
    return ratings;
}

public MorphiaArrayObject setRatings(Integer[] ratings) {
    this.ratings = ratings;
    return this;
}

public BigDecimal getMoney() {
    return money;
}

public MorphiaArrayObject setMoney(BigDecimal money) {
    this.money = money;
    return this;
}

@Override
public String toString() {
    return "MorphiaArrayObject [Id=" + Id + ", ratings="
            + Arrays.toString(ratings) + ", money=" + money + "]";
}
}

如果使用morphia添加文档,则读取和写入工作查找。与以下代码一样:

MorphiaArrayObject obj = new MorphiaArrayObject();
    obj.setMoney(new BigDecimal("1000000.00"));
    obj.setRatings(new Integer[]{4, 7, 8, 9});

    Db.save(obj);

但是如果你从javascript shell添加对象,我在使用morphia代码读取从shell添加的对象时会收到错误:

db.a_table.insert({money:" 345.0",rating:[4,5,9,8]});

1 个答案:

答案 0 :(得分:0)

问题在于使用数组:

整数[]评级;

我停止在morphia上使用数组,而是开始使用List并解决问题。