在检索文档时得到以下堆栈跟踪。文档有一个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
使用的TypeConverterpublic 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,这可以解决问题。