Spring MVC处理日期字符串参数自动转换成后台Date类型

 2023-02-19
原文作者:暴走编程 原文地址:https://juejin.cn/post/7053799267860742174

问题描述

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