Spring Boot 集成 MongoDB 读取数据出现Failed to convert from type [java.lang.String] to type [java.util.Date] 解决方法
前几天在公司的业务系统fat 环境有些列表报错,测试找到我帮忙看下发现列表 会去查询MongoDB中的数据 elk 报错
org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [java.util.Date] for value '2022-10-22 12:21:21'; nested exception is java.lang.IllegalArgumentException
这个就是MongoDB弱类型导致的 可能是有用户很老的数据存在格式问题导致 spring model 映射不上 ,解决这个就又2个方法 1是找出这些数据删除 2是为MongoDB添加一个转化器 ,我选择转化器 删除旧数据治标不治本开搞。
添加一个spring Converter转化器 string 转 date
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = formatter.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}
}
注册到mongoTemplate 中
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.mongodb.MongoDatabaseFactory;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.convert.MappingMongoConverter;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
import java.util.ArrayList;
import java.util.List;
// 该类的目的是把自定义编写的转换类 注入 MongoTemplate 中
@Configuration
public class MongoConfig {
@Autowired
MongoDatabaseFactory factory;
//MongoCustomConversions
@Bean //注册客制化转换 添加自定义转换类(楼主以TestConverter为列,具体编写跳转“编写自定义转换类”)
public MongoCustomConversions customConversions() {
List<Converter<?,?>> converters = new ArrayList<Converter<?,?>>();
converters.add(new DateConverter());
return new MongoCustomConversions(converters);
}
@Bean
public MongoTemplate mongoTemplate() {
MongoTemplate mongoTemplate = new MongoTemplate(factory);
MappingMongoConverter mongoMapping = (MappingMongoConverter) mongoTemplate.getConverter();
mongoMapping.setCustomConversions(customConversions()); // tell mongodb to use the custom converters
mongoMapping.afterPropertiesSet();
System.out.println("注入成功!");
return mongoTemplate;
}
}
这样就可以解决 Failed to convert from type [java.lang.String] to type [java.util.Date] 问题 spring 的Converter 类很强大 在spring mvc 中也可以添加自定义转化器。