檢索文檔時,我得到以下堆棧跟蹤。 該文檔具有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]});
恕我直言BigDecimalConverter是好的,我使用的是非常相似的東西:https://github.com/xeraa/mongouk2011/blob/53bb667f8227349aaea7b79607a9ff28af691e02/src/main/java/at/ac/tuwien/ec/mongouk2011/persistence /BigDecimalConverter.java 你可以添加數組部分的代碼片段嗎? – xeraa