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

当前台提交日期字符串到后台时,以字符串形式传输,若后台接收时采用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 {

    // 日期格式
    private static final List 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;
    }

}
  • 优点:灵活度高,可以在静态代码块里定义任意的日期格式,然后配置对应的正则表达式,兼顾了前两种方式.

Original: https://www.cnblogs.com/herokevin/p/15811675.html
Author: 暴走编程
Title: Spring MVC处理日期字符串参数自动转换成后台Date类型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/573225/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 我的个人网站

    阿戴Blog,记录Java开发心得体验的Blog posted @2020-09-24 11:07 秋山水色 阅读(58 ) 评论() 编辑 Original: https://w…

    Java 2023年6月5日
    075
  • 集合

    集合分为单列集合和双列集合。 Collection&#x96C6;&#x5408;&#x7684;&#x4F53;&#x7CFB;&…

    Java 2023年6月6日
    066
  • 【leetcode】42. 接雨水

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height = [0,1,0,2,1,0,1,3,2,1,2…

    Java 2023年6月6日
    074
  • java实现设置Excel下拉框

    在使用Excel的时候用到了下拉框,实现的效果如下↓ 在生成excel文件时,需要根据给出的下拉框选项列表动态生成下拉框。实现代码如下: private void createSe…

    Java 2023年6月5日
    0100
  • 代码生成器

    Mybatis Generator 使用xml配置文件形式自动生成 只生成实体类、mapper接口及mapper.xml。并且包含丰富的内容 首先添加mybatis依赖和相关插件 …

    Java 2023年6月13日
    083
  • 十三、常用类(完结)

    十三、常用类 13.1 包装类 13.1.1 包装类的分类 介绍:针对八种基本数据类型对应的引用类型作用:可以调用包装类里面的方法分类: 13.1.2 包装类的继承关系 学一个类首…

    Java 2023年6月5日
    051
  • ||运算你真的了解吗?

    或运算介绍 或运算:只要有一个条件为true,即为true。 通过如上逻辑关系图,还有另外一层 隐含的意思: 如果A条件是true,B条件不执行! 如果A条件是false,B条件要…

    Java 2023年6月8日
    066
  • 永辉彩食鲜架构概述

    背景 满足整个大B业务从线上到供应链的全线业务系统的研发和维护,保证整个系统的稳定性和性能。 架构思考 大B业务不同于小B业务,它没有常见的业务高并发的场景,所以更多是对业务数据的…

    Java 2023年6月8日
    0100
  • SpringBoot 定时任务不能同时运行的问题

    使用Spring Task可以非常方便的进行定时任务,但是默认只能有一个定时任务在执行。如何改变这种状况呢? 在定时任务方法上添加@Async注解即可。 java;gutter:t…

    Java 2023年5月30日
    095
  • Redis详细教程笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    050
  • Nginx几种负载均衡方式介绍

    Nginx几种负载均衡方式介绍 前言 负载均衡就是Nginx将请求分摊到不同的服务器中,保证服务的可用性,缓解服务压力,保证服务的响应速度,即使某一个应用服务不可用,也可以保证业务…

    Java 2023年6月15日
    074
  • Map接口总结(如何使用默认方法)

    default方法 排序在前的方法较为常用。 默认方法是为了在标准库中添加默认支持函数式方法,同时也不必修改现有的类,这样做虽然有一定的好处,但是实际上在子类中使用default方…

    Java 2023年6月16日
    048
  • Servlet中跨域问题详解

    一、什么是跨域 跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。 浏览器从一个域名的网页去请求另一个域名的资源时…

    Java 2023年6月6日
    071
  • 哈工大软件构造Lab1(2022)

    目录 一、实验目标概述 二、实验环境配置 1、安装编写java程序的IDE——IntelliJ IDEA 2、安装Git 3、安装Junit 4、GitHub Lab1仓库的URL…

    Java 2023年6月9日
    095
  • 求和平均统计

    单因素方差分析我大白话说就是求和平均统计,样本与平均值进行各种对比得出的结论,如下: 在试验中,把考察的指标称为试验指标,影响试验指标的条件称为因素。因素可分为两类,一类是人为可控…

    Java 2023年5月29日
    073
  • Java的发展史

    在当时,客户端编程所迈出的最重要的一步就是 插件(plug-in) 的开发。通过这种方式,用户可以下载一段代码,并将其插入到浏览器中适当的位置,以此来为浏览器添加新的功能。 插件又…

    Java 2023年5月29日
    066
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球