How to convert BigDecimal to Double in spring-data-mongodb framework
问题描述:我们都知道对于涉及钱的数据必须使用BigDecimal类型进行存储,今天在查询mongo时仍然有精度问题,虽然我在代码中使用了Big Decimal类型,但mongo中使用的是double类型。我初步推断是mongoTemplate在类型转换时出现了问题,根源还是因为mongodb中使用了double类型来存储。但是我决定不了mongodb于是我只能从代码入手进行四舍五入的处理。
解决办法:自定义一个customer-convert从而在mongoTemplate在mapping的时候进行转换,从而不需要在各个地方进行修改。这里还有一个问题就是原来使用了springboot,于是也就没了mongo.xml的配置。自己实现的convert就没有地方注册了。最后我通过Java配置的方式自己new一个mongoTemplate并且注入到Ioc容器中,这样在我new mongoTemplate的时候就有机会注册convert了。
下面是具体代码
@Configuration
public class MongodbConfiguration {
@Value("${spring.data.mongodb.uri}")
private String mongoUrl; @Bean
public MongoMappingContext mongoMappingContext() {
MongoMappingContext mappingContext = new MongoMappingContext();
return mappingContext;
} @Bean
@Primary
public MongoDbFactory dbFactory1() throws UnknownHostException {
return new SimpleMongoDbFactory(new MongoClientURI(mongoUrl));
} @Bean
public MappingMongoConverter mappingMongoConverter1() throws Exception {
DefaultDbRefResolver dbRefResolver = new DefaultDbRefResolver(this.dbFactory1());
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, this.mongoMappingContext());
List<Converter> converters = new ArrayList<>();
converters.add(new DoubleToBigDecimalConverter());
CustomConversions customConversions = new CustomConversions(converters);
converter.setCustomConversions(customConversions);
return converter;
} @Bean
@Primary
public MongoTemplate mongoTemplate() throws Exception {
return new MongoTemplate(this.dbFactory1(), this.mappingMongoConverter1());
}
} @ReadingConverter
class DoubleToBigDecimalConverter implements Converter<Double,BigDecimal> {
//在这里我们可以统一将double类型进行四舍五入并指定小数点后两位
@Override
public BigDecimal convert(Double source) {
BigDecimal bigDecimal = BigDecimal.valueOf(source);
return bigDecimal.setScale(2,BigDecimal.ROUND_HALF_UP);
}
}
How to convert BigDecimal to Double in spring-data-mongodb framework的更多相关文章
- Spring data mongodb 聚合,投射,内嵌数组文档分页.
尽量别直接用 DBObject ,Spring data mongodb 的api 本来就没什么多大用处,如果还直接用 DBObject 那么还需要自己去解析结果,说动做个对象映射,累不累 Spri ...
- spring data mongodb 配置遇到的几个问题
一. mongodb 2.2版本以上的配置 spring.data.mongodb.uri = mongodb://newlook:newlook@192.168.0.109:27017/admin ...
- spring data mongodb中,如果对象中的属性不想加入到数据库字段中
spring data mongodb中,如果对象中的属性不想加入到数据库字段中,可加@Transient注解,声明为透明属性 spring data mongodb 官网帮助文档 http://ww ...
- Spring Data MongoDB example with Spring MVC 3.2
Spring Data MongoDB example with Spring MVC 3.2 Here is another example web application built with S ...
- 使用Spring访问Mongodb的方法大全——Spring Data MongoDB查询指南
1.概述 Spring Data MongoDB 是Spring框架访问mongodb的神器,借助它可以非常方便的读写mongo库.本文介绍使用Spring Data MongoDB来访问mongod ...
- JAVA 处理 Spring data mongodb 时区问题
Spring data mongodb 查询出结果的时候会自动 + 8小时,所以我们看起来结果是对的 但是我们查询的时候,并不会自动 + 8小时,需要自己处理 解决方法 1 @JsonFormat ...
- Spring data mongodb ObjectId ,根据id日期条件查询,省略@CreatedDate注解
先看看ObjectId 的json 结构,非常丰富,这里有唯一机器码,日期,时间戳等等,所以强烈建议ID 使用 ObjectId 类型,并且自带索引 Spring data mongodb 注解 @C ...
- Spring data mongodb @CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy SpringSecurityAuditorAware,只记录用户名
要在Spring data mongodb 中使用@CreatedBy@LastModifiedBy@CreatedBy@LastModifiedBy 这四个注解 必须实现 SpringSecuri ...
- Spring Data MongoDB 三:基本文档查询(Query、BasicQuery)(一)
一.简单介绍 Spring Data MongoDB提供了org.springframework.data.mongodb.core.MongoTemplate对MongoDB的CRUD的操作,上一 ...
随机推荐
- edittext SearchView 失去焦点问题
edittext 默认自己主动获取焦点的 并且会出现小键盘非常烦人 <LinearLayout android:id="@+id/focus" ...
- 转:http2的资料与使用
https://imququ.com/post/http2-resource.html
- Win7如何改变用户文件夹位置
现在装WIN7后第一件就是改变用户账户文件夹位置..因为里面存着一些软件的设定和信息等..不必要每次装后都手动改一次.. 已前用优化大师改.太麻烦.也不稳定有时有些目录不能完全改过来.. 通过命令mk ...
- 病毒木马查杀实战第022篇:txt病毒研究
前言 反病毒爱好者们非常喜欢讨论的一个问题就是,现在什么样的病毒才算得上是主流,或者说什么样的病毒才是厉害的病毒呢?我们之前的课程所解说的都是Ring3层的病毒.所以有些朋友可能会觉得.那么Ring0 ...
- JUDE工具类图制作
1. 类图图形元素 2. 连接线条 线的关系解释如下: 3. 创建一个类
- 更改字段、添加字段脚本以及sql回滚
--修改字段名称 EXEC sp_rename '[dbo].[SysMenu].[Type]', 'Position', 'COLUMN' --添加字段 alter table [dbo].[Age ...
- struts提交action乱码
没下雪但冷的让人直打哆嗦的天气,冷醉了的教训!! 问题解决步骤: 1.首先确认页面编码是否准确,并且是否与struts编码配置一样,就算是gbk对GBK,最好大小写保持一样 2.尝试先转码一次吧! ...
- C# NPOI操作Excel(下)
根据自己项目需求编写,仅供参考 个人建议:使用Excel模板进行导出操作.尽量避免自己生成Excel(既繁琐又容易出BUG).大多情况下导出Excel都是固定格式,使用模板导出会方便很多. publi ...
- Android应用TranslateAnimation移动之后,利用视图的setLayoutPara
Android中利用TranslateAnimation移动时,不设置mTranslateAnimation.setFillAfter(true);,而利用视图的setLayoutParams来重新定 ...
- DNS的概念,用途,DNS查询的实现算法
1.DNS的概念,用途 DNS是由解析器以及域名服务器组成的. 域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器. DNS ...