2014-07-25 60 views
0

檢索文檔時,我得到以下堆棧跟蹤。 該文檔具有BigDecimal字段,似乎在調試器上運行時可以成功解析。但是,程序在解析五個整數的數組時崩潰。Morphia ArrayStoreException BigDecimal和Integer數組

我注意到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) 

這是我的TypeConverter用於通過BigDecimal

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 { @Id 的ObjectId標識;

@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的外殼添加對象,我閱讀使用嗎啡代碼從外殼添加的對象時出現錯誤:

db.a_table。 insert({money:「345.0」,ratings:[4,5,9,8]});

+0

恕我直言BigDecimalConverter是好的,我使用的是非常相似的東西:https://github.com/xeraa/mongouk2011/blob/53bb667f8227349aaea7b79607a9ff28af691e02/src/main/java/at/ac/tuwien/ec/mongouk2011/persistence /BigDecimalConverter.java 你可以添加數組部分的代碼片段嗎? – xeraa

回答

0

問題是與使用數組:

整數[]的評分;

我停止在morphia上使用數組,而是開始使用List並解決該問題。