我使用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发布于 2017-11-01 16:46:50
正如您所提到的,Morphia包确实有自己的BigDecimalConverter,您可以将其注册到对象。但是,如果您需要一些其他自定义行为,您可以创建自己的转换器。例如,当我需要更改BigDecimalConverter的encode实现时,我使用覆盖此方法的类扩展了该类。请查看以下实现。
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);
}
} 发布于 2017-11-03 16:26:47
还要注意的是,有些人在使用BigDecimal和较早版本的java驱动程序时遇到了问题。(参见this issue)。确保您的mongo-java-driver版本为3.5.0或更高版本。
发布于 2019-12-03 11:13:49
据我所知,Morphia并不完全支持大小数,但这种依赖关系将大小数转换为它支持的数据类型。
https://mvnrepository.com/artifact/dev.morphia.morphia/core/1.5.8
https://stackoverflow.com/questions/47030246
复制相似问题