问题描述
当前台提交日期字符串到后台时,以字符串形式传输,若后台接收时采用Date类型,则会报格式转换错误的异常.
解决
方式一:
将 @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
注解添加到实体类的字段上.
- 优点:可以灵活定义接收的类型
- 缺点:不能实现全局统一处理,要为每个需要转换的字段添加注解
方式二:
定义一个 BaseController
基础类,在类中使用 @InitBinder
注解定义一个全局的日期格式转换的方法,在定义其它Controller时继承 BaseController 即可.
@InitBinder
public void initBinder(ServletRequestDataBinder binder) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}
- 优点:可以实现全局处理,无需关注具体需要转换的日期字段
- 缺点:只能定义一种日期格式
方式三(推荐):
自定义一个 DateConverterConfig
类,实现 spring 提供的 Converter,重写里面的 convert()
方法.
/**
* 全局 日期格式 转换器
*/
@Component
public class DateConverterConfig implements Converter<String, Date> {
// 日期格式
private static final List<String> formarts = new ArrayList<>(4);
static{
formarts.add("yyyy-MM");
formarts.add("yyyy-MM-dd");
formarts.add("yyyy-MM-dd hh:mm");
formarts.add("yyyy-MM-dd hh:mm:ss");
}
@Override
public Date convert(String source) {
String value = source.trim();
if ("".equals(value)) {
return null;
}
if(source.matches("^\\d{4}-\\d{1,2}$")){
return parseDate(source, formarts.get(0));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")){
return parseDate(source, formarts.get(1));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(2));
}else if(source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")){
return parseDate(source, formarts.get(3));
}else {
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
/**
* 格式化日期
* @param dateStr String 字符型日期
* @param format String 格式
* @return Date 日期
*/
public Date parseDate(String dateStr, String format) {
Date date=null;
try {
DateFormat dateFormat = new SimpleDateFormat(format);
date = dateFormat.parse(dateStr);
} catch (Exception e) {
}
return date;
}
}
- 优点:灵活度高,可以在静态代码块里定义任意的日期格式,然后配置对应的正则表达式,兼顾了前两种方式.