直接使用BigDecimal类型存储数据到MongoDB里面会变成数组,最后查询的数据会报错,需要做一下转换。
报错信息:
"Cannot convert [0.00] of type class java.util.ArrayList into an instance of class java.math.BigDecimal! Implement a custom Converter<class java.util.ArrayList, class java.math.BigDecimal> and register it with the CustomConversions. Parent object was:
解决方案:
import org.bson.types.Decimal128;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
import java.math.BigDecimal;
/**
* BigDecimal转Decimal128
*
*/
@ReadingConverter
@WritingConverter
public class BigDecimalToDecimal128Converter implements Converter<BigDecimal, Decimal128> {
@Override
public Decimal128 convert(BigDecimal source) {
return new Decimal128(source);
}
}
import org.bson.types.Decimal128;
import org.springframework.core.convert.converter.Converter;
import java.math.BigDecimal;
/**
* Decimal128转BigDecimal
*
*/
public class Decimal128ToBigDecimalConverter implements Converter<Decimal128, BigDecimal> {
@Override
public BigDecimal convert(Decimal128 source) {
return source.bigDecimalValue();
}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.convert.*;
import org.springframework.data.mongodb.core.mapping.MongoMappingContext;
import java.util.ArrayList;
import java.util.List;
@Configuration
public class MongodbConfig {
/**
* 自定义转换
*
* @param mongoMappingContext mongoMappingContext
* @param factory factory
* @return 转换
*/
@Bean
public MappingMongoConverter mappingMongoConverter(MongoMappingContext mongoMappingContext,
MongoDatabaseFactory factory) {
mongoMappingContext.setAutoIndexCreation(true);
mongoMappingContext.afterPropertiesSet();
DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);
MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext);
converter.setTypeMapper(new DefaultMongoTypeMapper(null));
List<Object> list = new ArrayList<>();
list.add(new BigDecimalToDecimal128Converter());
list.add(new Decimal128ToBigDecimalConverter());
converter.setCustomConversions(new MongoCustomConversions(list));
return converter;
}
/**
* 上下文
*
* @return 上下文
*/
@Bean
public MongoMappingContext mongoMappingContext() {
return new MongoMappingContext();
}
}