2017-10-31 20 views
5

Tôi đang sử dụng morphia để kiên trì đối tượng rằng một trong các trường của nó là BigDecimal.morphia BigDecimal persistence issue

@Entity 
class MyObject { 
    BigDecimal myField; 
} 

Và tôi cố gắng để lưu nó vào 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); 

Nhưng tôi nhận được ngoại lệ sau đây:

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

Bạn đã kiểm tra: https://stackoverflow.com/questions/24498011/reading-bigdecimal-with-morphia? Làm cho riêng của bạn typeconverter là một lựa chọn – LoreV

Trả lời

6

Như bạn nói, gói nha phiến không có BigDecimalConverter riêng của mình mà bạn có thể đăng ký đối tượng. Nhưng nếu bạn cần một số hành vi tùy chỉnh khác, bạn có thể tạo trình biến đổi của riêng bạn. Ví dụ, khi tôi cần thay đổi việc thực thi mã hóa của BigDecimalConverter, tôi mở rộng lớp này với một lớp đã vượt qua phương thức này. Kiểm tra triển khai sau.

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! Cảm ơn rất nhiều –

0

Cũng lưu ý rằng một số người gặp sự cố với phiên bản BigDecimal và cũ hơn của trình điều khiển java. (Xem this issue). Đảm bảo bạn có phiên bản driver mongo-java-phiên bản 3.5.0 hoặc mới hơn.