Чтение BigDecimal с Morphia

У меня есть POJO, который использует BigDecimal. Когда я сохраняю объект в morphia, становится ясно, что значение сохраняется в виде строки. Но если я изменю базу данных из оболочки javascript, чтобы она имела значение десятичного числа, попытка прочитать объект с использованием класса morphia завершается со следующей ошибкой:

Например:

@Entity(value = "table_name", noClassnameStored = true)
public class Advertisement implements Table {
  BigDecimal value;
}

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:537)
    at org.mongodb.morphia.converters.IntegerConverter.decode(IntegerConverter.java:35)
    at org.mongodb.morphia.converters.DefaultConverters.fromDBObject(DefaultConverters.java:134)
    at org.mongodb.morphia.mapping.ValueMapper.fromDBObject(ValueMapper.java:27)
    at org.mongodb.morphia.mapping.Mapper.readMappedField(Mapper.java:604)
    at org.mongodb.morphia.mapping.Mapper.fromDb(Mapper.java:585)
    at org.mongodb.morphia.mapping.Mapper.fromDBObject(Mapper.java:296)
    at org.mongodb.morphia.query.MorphiaIterator.convertItem(MorphiaIterator.java:78)
    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:294)
    at 
...

Какова правильная форма для добавления десятичного значения в виде строки в mongodb, чтобы morphia могла прочитать это значение в Java BigDecimal?


person jeremyvillalobos    schedule 30.06.2014    source источник


Ответы (2)


Как упоминает @evanchooly, у меня уже был код BigDecimal, чтобы иметь возможность использовать код объекта в Morphia. Это код:

public class BigDecimalConverter extends TypeConverter {

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.

Как ни странно, обходной путь заключался в использовании аннотации @Property() для переменной. Вместо того, чтобы позволить morphia назвать ключ.

person jeremyvillalobos    schedule 02.07.2014

Вы можете увидеть обсуждение этого вопроса в списке рассылки с несколько предложенных решений.

person evanchooly    schedule 30.06.2014