標籤:cep post cal context 行修改 data arraylist url div
問題描述:我們都知道對於涉及錢的資料必須使用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了。
下面是具體代碼
@Configurationpublic 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()); }}@ReadingConverterclass 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