在开发中遇到提交的日期数据与底层数据表的日期时间类型不匹配的时候的情况,
这是因为提交的日期数据在网线中传输的都是字符串类型,而数据表要求的是datetime类型,
所以会引发类型不匹配的异常。
解决方案:
方案一:请求后台的时候,SpringBoot会自动进行转化,此时无法将字符串转化为Date,
此时就需要我们强制转化:
1.写一个SpringToDateConverter implements Converter<String,Date>,并实现convert方法。
import org.springframework.core.convert.converter.Converter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class StringToDateConverter implements Converter<String,Date> {
private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
private static final String shortDateFormat = "yyyy-MM-dd";
private static final String dateFormat2 = "yyyy/MM/dd HH:mm:ss";
private static final String shortDateFormat2 = "yyyy/MM/dd";
@Override
public Date convert(String source) {
if(null==source||"".equals(source)){
return null;
}
source = source.trim();
try {
SimpleDateFormat formatter;
if(source.contains("-")){
if(source.contains(":")){
formatter = new SimpleDateFormat(dateFormat);
}else {
formatter = new SimpleDateFormat(shortDateFormat);
}
Date dtDate = formatter.parse(source);
return dtDate;
}else if(source.contains("/")){
if(source.contains(":")){
formatter = new SimpleDateFormat(dateFormat2);
}else{
formatter = new SimpleDateFormat(shortDateFormat2);
}
Date dtDate = formatter.parse(source);
return dtDate;
}
}catch (Exception e){
throw new RuntimeException(String.format("parse %s to Date fail",source));
}
throw new RuntimeException(String.format("parse %s to Date fail",source));
}
}
2.定制自己的一个@Configuration类型,在SpringBoot启动过程中可以作为配置文件加载。
@Configuration
public class WebConfigBeans {
@Autowired
private RequestMappingHandlerAdapter handlerAdapter; //处理器适配器
@PostConstruct
public void initEditableValidation(){
ConfigurableWebBindingInitializer initializer =(ConfigurableWebBindingInitializer)handlerAdapter.getWebBindingInitializer();
if(initializer.getConversionService()!=null){
GenericConversionService genericConversionService = (GenericConversionService)initializer.getConversionService();
//向现有的环境中注册了自己的 一个日期格式转换器 StringToDateConverter
genericConversionService.addConverter(new StringToDateConverter());
}
}
}
3.从数据库表中获取数据的展示(关于List列表中时间格式的设定):在实体类属性上添加:
@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
方案二:
1.定制一个util的工具类
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class JsonDateSerializer extends JsonSerializer<Date> {
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider)
throws IOException,JsonProcessingException {
String value = dateFormat.format(date);
jsonGenerator.writeString(value);
}
}
2.在Model中加入注解
/*界面上的数据显示*/
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
/*控制的是数据进入到后台的格式*/
@JsonSerialize(using = JsonDateSerializer.class)
方案三:(有待考证,部分计算机上行不通,会报错)
直接在Model层的对应字段上添加了如下注解:
@DateTimeFormat(pattern = "yyyy-MM-dd hh:mm:ss")
注意;推荐大家使用第一种方案