• springboot 全局时间转换器


    前言

    在这里插入图片描述

    • 前端框架:layui mini
    • 后台框架:springboot
      layui table按钮监听提交数据,进行数据的操作,后台报错,解决过程记录;

    前端操作

    在这里插入图片描述
    在这里插入图片描述

    Network Headers

    在这里插入图片描述

    Network preview

    在这里插入图片描述

    后台日志信息

    全部报错信息

    Field error in object 'TAccountAgency' on field 'createTime': rejected value [2022-08-17 15:46:18]; codes [typeMismatch.TAccountAgency.createTime,typeMismatch.createTime,typeMismatch.java.util.Date,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [TAccountAgency.createTime,createTime]; arguments []; default message [createTime]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createTime'; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@com.fasterxml.jackson.annotation.JsonFormat java.util.Date] for value '2022-08-17 15:46:18'; nested exception is java.lang.IllegalArgumentException]]
    
    • 1

    主要报错信息

    Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'createTime';
    
    • 1

    问题所在

    从日志信息可以看出,是因为前端页面以字符串形式传递日期时间字符串到后台接口,默认的springboot时间处理器无法将java.lang.String类型的字符串转换成java.util.Date类型,进而导致“Failed to convert property value of type ‘java.lang.String’ to required type ‘java.util.Date’ for property ‘createTime’;”,最后总结就是前端页面中的日期时间字符串与后端JavaBean类中的Date类型不匹配,

    解决办法一

    • @JsonFormat(pattern=“yyyy-MM-dd HH:mm:ss”, timezone=“GMT+8”)
      • 格式化前端传递进来的日期时间参数形式
    • @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)
      • 格式化后端对外输出的日期时间格式
        在后端的日期类型的字段上添加以上注解代码片
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    解决办法二

    解决办法一,需要在每个有时间类型字段上都添加注解,当代码较多时,就有些麻烦,可以编写一个全局的转换器,代码如下 代码块

    实现org.springframework.core.convert.converter.Convert接口,来完成日期格式的转换

    package com.zaxk.config;
    
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.core.convert.converter.Converter;
    import org.springframework.stereotype.Component;
    
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    
    /**
     * @description: 全局时间转换器
     * @author: Mr.Jkx
     * @time: 2022/8/17 16:53
     */
    @Component
    public class CourseDateConverter implements Converter<String, Date> {
        private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";
        private static final String dateFormata = "yyyy-MM-dd HH:mm:ss";
        private static final String shortDateFormat = "yyyy-MM-dd";
        private static final String shortDateFormata = "yyyy/MM/dd";
        private static final String timeStampFormat = "^\\d+$";
    
        @Override
        public Date convert(String value) {
            if (StringUtils.isEmpty(value)) {
                return null;
            }
            value = value.trim();
            try {
                if (value.contains("-")) {
                    SimpleDateFormat formatter;
                    if (value.contains(":")) {
                        // yyyy-MM-dd HH:mm:ss 格式
                        formatter = new SimpleDateFormat(dateFormat);
                    } else {
                        // yyyy-MM-dd 格式
                        formatter = new SimpleDateFormat(shortDateFormat);
                    }
                    return formatter.parse(value);
                } else if (value.matches(timeStampFormat)) {
                    //时间戳
                    Long lDate = new Long(value);
                    return new Date(lDate);
                } else if (value.contains("/")) {
                    SimpleDateFormat formatter;
                    if (value.contains(":")) {
                        // yyyy/MM/dd HH:mm:ss 格式
                        formatter = new SimpleDateFormat(dateFormata);
                    } else {
                        // yyyy/MM/dd 格式
                        formatter = new SimpleDateFormat(shortDateFormata);
                    }
                    return formatter.parse(value);
                }
            } catch (Exception e) {
                throw new RuntimeException(String.format("parser %s to Date fail", value));
            }
            throw new RuntimeException(String.format("parser %s to Date fail", value));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    此时JavaBean类中的属性,只需要格式化对外输出的类型,如下即可 代码块

    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
    private Date createTime;
    
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
    private Date updateTime;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    参考链接

    1. pringBoot 通过Converter转化 date类型参数
    2. SpringBoot 通过Converter转化 date类型参数
    3. springboot~对@RequestParam中Date参数的适配
  • 相关阅读:
    使用Redis实现延时队列
    mysql第十六章 变量,流程控制触发器课后练习
    软件工程导论概述-----MP微软编程和MSF
    【翻译】Qt 打印支持模块
    Ajax零基础入门 Ajax零基础入门第三天 3.3 封装自己的Ajax函数 && 3.4 XMLHttpRequest Level2的新特性
    【Ajax进阶】跨域和JSONP的学习
    深入理解JNI
    HTB[入门]Redeemer题解
    前端面试题之【HTTP/HTML/浏览器】
    Three---面向对象与面向过程/属性和变量/关于self/一些魔法方法的使用/继承/super方法/多态
  • 原文地址:https://blog.csdn.net/weixin_43948057/article/details/126389971