Morphia ArrayStoreException BigDecimal and Integer Array



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

我注意到BigDecimal的使用,因为有其他文章提到了BigDecimal和ArrayStoreException。

这个错误似乎表明数组正在被解析为列表。

如果我从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)

公共类MorphiaArrayObject {@ idObjectId 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中添加对象,我得到错误时,读取从shell中添加的对象使用形态代码:

db.a_table。插入({钱:"345.0",评级:[8]4、5、9日});

问题是使用数组:

Integer[]评级;

我不再在morphia上使用数组,而是开始使用List,这可以解决问题。

最新更新