检索文档时,我得到以下堆栈跟踪。 该文档有一个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]});
答案 0 :(得分:0)
问题在于使用数组:
整数[]评级;
我停止在morphia上使用数组,而是开始使用List并解决问题。