2017-10-31 19 views
5

मैं ऑब्जेक्ट का उपयोग कर रहा हूं ताकि ऑब्जेक्ट को जारी रखा जा सके कि इसके खेतों में से एक बिगडिसीमल है।morphia BigDecimal दृढ़ता मुद्दा

@Entity 
class MyObject { 
    BigDecimal myField; 
} 

और मैं db करने के लिए इसे बचाने की कोशिश:

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); 

लेकिन मैं निम्न अपवाद प्राप्त करें:

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

क्या आपने जांच की: https://stackoverflow.com/questions/24498011/reading-bigdecimal-with-morphia? अपना खुद का टाइप कनवर्टर एक विकल्प – LoreV

उत्तर

6

आप उल्लेख किया है, अफ़ीम का सत्त्व पैकेज का अपना BigDecimalConverter है कि आप ऑब्जेक्ट पर पंजीकरण कर सकते हैं। लेकिन अगर आपको कुछ अन्य कस्टम व्यवहार की ज़रूरत है, तो आप स्वयं का कनवर्टर बना सकते हैं। उदाहरण के लिए, जब मुझे BigDecimalConverter के एन्कोड कार्यान्वयन को बदलने की आवश्यकता होती है, तो मैंने इस वर्ग को उस विधि से बढ़ाया जो इस विधि को ओवरराइड करता है। निम्नलिखित कार्यान्वयन देखें।

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

फिनली बनाएं! बहुत बहुत धन्यवाद –

0

ध्यान दें कि कुछ लोगों को जावा ड्राइवर के BigDecimal और पुराने संस्करणों में समस्याएं हैं। (this issue देखें)। सुनिश्चित करें कि आपके पास मोंगो-जावा-ड्राइवर संस्करण 3.5.0 या नया है।

संबंधित मुद्दे