问题描述
当前台提交日期字符串到后台时,以字符串形式传输,若后台接收时采用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; } }
优点:灵活度高,可以在静态代码块里定义任意的日期格式,然后配置对应的正则表达式,兼顾了前两种方式.