2017-10-31 148 views
5

Kendi alanlarından biri BigDecimal olan nesneyi sürdürmek için morphia kullanıyorum.morphia BigDecimal kalıcılık sorunu

@Entity 
class MyObject { 
    BigDecimal myField; 
} 

Ve db kaydetmeyi deneyin:

Morphia morphia = new Morphia(); 
    Datastore datastore = morphia.createDatastore(new MongoClient("localhost"), "myStore"); 
    morphia.getMapper().getConverters().addConverter(new BigDecimalConverter()); 
    MyObject foo = new MyObject(); 
    foo.setMyField(new BigDecimal("1.1111111111111111")); 
    datastore.save(foo); 

Ama şu istisna olsun: Bahsettiğiniz gibi

Caused by: java.lang.RuntimeException: java.lang.NumberFormatException: Conversion to Decimal128 would require inexact rounding of 1.111111111111111160454356650006957352161407470703125 
at org.mongodb.morphia.mapping.ValueMapper.toDBObject(ValueMapper.java:29) 
at org.mongodb.morphia.mapping.Mapper.writeMappedField(Mapper.java:867) 
at org.mongodb.morphia.mapping.Mapper.toDBObject(Mapper.java:982) 
... 7 more 
+0

Aşağıdakileri kontrol ettiniz: https://stackoverflow.com/questions/24498011/reading-bigdecimal-with-morphia? Kendi typeconverter bir seçenek – LoreV

cevap

6

, Morfin paketi kendi BigDecimalConverter ilgisi var nesneye kayıt olabilirsiniz. Ancak başka bir özel davranışa ihtiyacınız varsa, kendi dönüştürücünüzü oluşturabilirsiniz. Örneğin, BigDecimalConverter'ın kodlama uygulamasını değiştirmem gerektiğinde, bu sınıfı bu yöntemi geçersiz kılan bir yöntemle genişlettim. Aşağıdaki uygulamaya göz atın.

public class CustomBigDecimalConverter extends 
org.mongodb.morphia.converters.BigDecimalConverter { 

    public CustomBigDecimalConverter() { 
     super(); 
    } 

    @Override 
    public Object encode(final Object value, final MappedField optionalExtraInfo) { 
     if (value instanceof BigDecimal) { 
      return ((BigDecimal) value).setScale(10, RoundingMode.CEILING); 
     } 
     return super.encode(value, optionalExtraInfo); 
    } 
} 
+0

Finnaly olun! Çok teşekkürler –

0

Ayrıca, bazı kişilerin java sürücüsünün BigDecimal ve eski sürümleriyle ilgili sorunları olduğunu unutmayın. (Bkz. this issue). Mongo-java-driver 3.5.0 veya daha yeni bir sürümünüz olduğundan emin olun.