起因:

  在数据库设计中,日期时间等类型字段一般设置为Datetime格式,所以有时在接口请求实体bean中,对应的接口字段的数据类型可能会被设置为Date类型。

  而在java常用场景中的时间格式一般有三种:yyyyMMddHHmmss ,yyyy-MM-dd HH:mm:ss , ISO8601,此处使用格式1、2、3来代替。

  目前最常使用的时间格式为格式1。

问题:

  当接口中某字段类型设置为Date类型时,由于我们本身的需要,会再该字段上加上注解

  @JsonFormat(pattern = "yyyyMMddHHmmss", timezone = "GMT+8")

  由于swagger本身的限制,在测试页面做集成测试的时候,该字段是不允许传格式1类型的字符串的,允许使用的只有格式2、3。

  使用格式2的时候,由于框架本身会将请求数据注入到接口的请求实体bean中,此时会出现的一个问题就是页面上传的时间和注入到实体bean内的值不一致,导致业务出错。

  而使用格式3的时候,也会出现注入问题,因为格式对应不正确最后抛出非法参数异常,无法将ISO8601注入到格式1类型中。

  但是使用curl测试的时候,字段传格式1的字符串是可以正确注入到实体bean,只是对测试人员并不友好。

解决方法:

  1,去掉所有的JsonFormat注解,页面传格式3的字符串,可以正确注入至接口实体bean中,缺点不符合现在主流使用规范,比如接口对接的时候,一般会使用格式1类型

  2,将接口实体bean中的字段类型改为String类型,这样就不会有格式限制。但是另外带来问题有两个,会对已写好的代码做出较大的改动,另外,String格式缺少对日期的校验

  针对这些问题,提出另外的解决方案如下:如果不想对业务代码做出改动,由于在业务代码中使用的时候会直接调用get方法,所以我们可以重载该字段的get方法,改为反应一个Date类型的值,如此,可不同修改业务代码 。

  针对字段校验问题

  可以使用框架自带的注解@Pattern来限制格式,@Length来限制长度,但是缺少日期校验中专用的两个功能@Past和 @Futrue。

  所以最终解决方案为自定义一个日期类型的注解,自定两个boolean类型变量past与future。然后对字段进行校验。

spring Date格式问题的更多相关文章

  1. SpringBoot+MyBatis Plus对Map中Date格式转换的处理

    在 SpringBoot 项目中, 如何统一 JSON 格式化中的日期格式 问题 现在的关系型数据库例如PostgreSQL/MySQL, 都已经对 JSON 类型提供相当丰富的功能, 项目中对于不需 ...

  2. JSP页面用EL表达式 输出date格式

    JSP页面用EL表达式 输出date格式 1.头上引入标签 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix ...

  3. js 将php生成的time()类型时间戳转化成具体date格式的日期

    需求:      将首页显示的int类型的时间转化为date类型的时间格式:      QuestionModel获取到question列表数据时,包括question['pub_time'],在显示 ...

  4. mybatis从数据库中取到的date格式不是yyyy-MM-dd HH:mm:ss

    问题:sqlserver中的存储时间格式为date,pojo的时间属性也是date,直接mybatis取出的时间格式是带英语的那种,不满足客户要求. 解决:将pojo的时间属性改为string类型,在 ...

  5. 使用 JSON.parse 反序列化 ISO 格式的日期字符串, 将返回Date格式对象

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. 【数据库_Mysql】JAVA-数据库Date格式在前台JSP页面的获取

    问题: 数据库保存的为date格式的日期 在前台JSP页面显示的为一串数字1487897     解决办法: 数据库表中字段对应的实体对象属性的get方法上添加一行代码 页面即可正常显示      

  7. Java中String与Date格式之间的转换

    转自:https://blog.csdn.net/angus_17/article/details/7656631 经常遇到string和date之间的转换,把相关的内容总结在这里吧: 1.strin ...

  8. 字符串时间转Date格式

    /** * 字符串时间格式转 Date 格式 * @param strDate * @return */ public static Date getDateTimeByStringTime(Stri ...

  9. 字符串格式时间转Date格式

    /** * 字符串时间格式转 Date 格式 * @param strDate * @return */ public static Date getDateTimeByStringTime(Stri ...

随机推荐

  1. OpenStack搭建Q版在控制节点上的环境准备(step2)

    接下来是只需要在控制节点上准备的环境配置.其中虽然NTP服务需要在所有节点上都安装,但NTP服务在控制节点和其他的节点上的配置是不同的,所以不把它放在step1的公共配置中进行准备.如下: 1.配置N ...

  2. Android studio 中添加依赖model时依赖所需的准备

    例如向app中添加依赖core: core要做如下修改: 1.将core中build.gradle中   修改为  . 2.将core中的 applicationId 注释掉.

  3. (转)通过注册表修改VC6.0的字体

    出处:http://www.cnblogs.com/PocketZ 在VC6.0下更改字体,我们一般通过菜单-Tools-Options-Format来更改 但在我的win7 64位系统下这一选项下的 ...

  4. 2018-2019-2 20165312《网络攻防技术》Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165312<网络攻防技术>Exp6 信息搜集与漏洞扫描 目录 一.信息搜集技术与隐私保护--知识点总结 二.实验步骤 各种搜索技巧的应用 Google Hac ...

  5. 4、redis 分布式锁

    1. 前言 关于分布式锁的实现,目前常用的方案有以下三类: 数据库乐观锁: 基于分布式缓存实现的锁服务,典型代表有 Redis 和基于 Redis 的 RedLock: 基于分布式一致性算法实现的锁服 ...

  6. Emacs下scheme编程环境的设置

    Scheme编程环境搭建 1.1 安装Chez Scheme git clone https://github.com/cisco/ChezScheme.git cd ChezScheme ./con ...

  7. ubuntu开机自动启动服务

    编辑rc.loacl脚本 Ubuntu开机之后会执行/etc/rc.local文件中的脚本,所以我们可以直接在/etc/rc.local中添加启动脚本.当然要添加到语句:exit 0 前面才行.如: ...

  8. kubernetes学习笔记之十四:helm入门

    1.Helm的简介 Helm是Kubernetes的一个包管理工具,用来简化Kubernetes应用的部署和管理.可以把Helm比作CentOS的yum工具. Helm有如下几个基本概念: Chart ...

  9. 8 种常被忽视的 SQL 错误用法

      来源:db匠 yq.aliyun.com/articles/72501 sql语句的执行顺序: FROM <left_table> ON <join_condition> ...

  10. mongo 数据查询

    基本查询 方法find():查询 db.集合名称.find({条件文档}) 方法findOne():查询,只返回第一个 db.集合名称.findOne({条件文档}) 方法pretty():将结果格式 ...