说在前面

最近在公司实习,接触了一个中小型的后台管理系统,不得不说,项目的目录结构比我平时做的"课程设计"要来得复杂,于是我先去看了Github上一些后台管理系统的模板项目

在guns(https://gitee.com/stylefeng/guns)后台管理系统中,我用"代码生成"功能生成模板页面和后台代码后,将一个含有日期类型的实体类的记录添加到数据表,中间总是碰到一个类型转换的错误

我的第一反应就是自定义一个继承JsonDeserialize<Date>抽象类的具体类,然后在日期类型字段上添加@JsonDeserialize(using = ***.class)注解,但是一直不成功

public class StringToDateConvert extends JsonDeserializer<Date> {

  private final String[] patterns = {
    "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss",
    "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss"
  };

  @Override

  public Date deserialize(JsonParser p, DeserializationContext ctxt)

  throws IOException, JsonProcessingException {

    String str = p.getText();

    if (StringUtils.isEmpty(str)) {

      return null;
    } else {

      try {

        return DateUtils.parseDate(str, Locale.CHINA, patterns);
      } catch (ParseException e) {

        e.printStackTrace();

        return null;
      }
    }
  }
}
// 添加注解到对应字段
@JsonDeserialize(using = StringToDateConvert.class)
private Date dateField;

经过debug调试,发现根本就没有经过我的自定义反序列化类

打倒BUG

之前有很长一段时间我做的都是前后端分离的项目,大多数情况下都通过Json格式传递数据,Http请求头的Content-Type为 application/json类型

但是在guns中,Http请求头的Content-Type为application/x-www-form-urlencoded类型,所以我自定义的Json反序列化配置自然就不会起作用,常见的三种Content-Type如下:

application/json

数据以Json格式发送

application/x-www-form-urlencoded

form标签中默认的encType,数据被编码为键值对格式,各键值对以&分隔后发送

multipart/form-data

常用于文件上传

最后,我通过在字段上添加@DateTimeFormat(pattern = "yyyy-MM-dd")注解解决了这个问题,这是一个非常便捷的注解,可以作用在多种表示时间的类上

Declares that a field or method parameter should be formatted as a date or time. Supports formatting by style pattern, ISO date time pattern, or custom format pattern string. Can be applied to java.util.Date, java.util.Calendar, java.lang.Long, Joda-Time value types; and as of Spring 4 and JDK 8, to JSR-310 java.time types too.

BUG战斗史 —— 日期格式与字符串之间的转换的更多相关文章

  1. SQL Server 取日期时间格式 日期与字符串之间的转换

    SQL Server 取日期时间部分   在本文中,GetDate()获得的日期由两部分组成,分别是今天的日期和当时的时间: Select GetDate()  用DateName()就可以获得相应的 ...

  2. javascript中日期格式与时间戳之间的转化

    日期格式与时间戳之间的转化 一:日期格式转化为时间戳 function timeTodate(date) { var new_str = date.replace(/:/g,'-'); new_str ...

  3. MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串

    原文:MVC扩展ModelBinder使类型为DateTime的Action参数可以接收日期格式的字符串 如何让视图通过某种途径,把符合日期格式的字符串放到路由中,再传递给类型为DateTime的控制 ...

  4. java中数组、集合、字符串之间的转换,以及用加强for循环遍历

    java中数组.集合.字符串之间的转换,以及用加强for循环遍历: @Test public void testDemo5() { ArrayList<String> list = new ...

  5. <摘录>Gson对Java嵌套对象和JSON字符串之间的转换

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识, ...

  6. json对象和json字符串之间的转换-JavaScript实现

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. ByteArray、16进制、字符串之间的转换

    ByteArray.16进制.字符串之间的转换: package fengzi.convert { import flash.utils.ByteArray; public class ByteArr ...

  8. Java基础——基本类型和包装类、基本类型和字符串之间的转换

    基本类型和包装类之间的转换 基本类型和包装类之间经常需要互相转换,以 Integer 为例(其他几个包装类的操作雷同哦): 在 JDK1.5 引入自动装箱和拆箱的机制后,包装类和基本类型之间的转换就更 ...

  9. C++中数字与字符串之间的转换,别人的,

    C++中数字与字符串之间的转换   1.字符串数字之间的转换 (1)string --> char *   string str("OK");   char * p = st ...

随机推荐

  1. Window常用快捷键

    Window常用快捷键 Ctrl+C:复制 Ctrl+V:粘贴 Ctrl+A:全选 Ctrl+X:剪切 Ctrl+D:删除 Ctrl+Z:撤销 Ctrl+Y:反撤销 Ctrl+Shift+Esc:调出 ...

  2. 关于JS继承

    关于JS继承 关于继承这个概念,是由面向对象衍生出来的.而JS身为一种基于面向对象而设计的语言,它和正统的面向对象语言又是有差别的. 面向对象语言 身为面向对象语言需要对开发者提供四种能力: ①:封装 ...

  3. 入门不容易->先从数组说起

    数据结构,平时用得最多,接触最多的也是数组,先从数组说起. 数组的概念  什么是数组 一组数据,一秒钟可以申明1000个变量的骚操作. 存储相同的类型,连续的存储空间. 最重要的一点:按下标找元素. ...

  4. 查看oracle归档日志路径

    转至:https://blog.csdn.net/u010098331/article/details/50729896/ 查看oracle归档日志路径 1.修改归档日志的格式 默认格式是:" ...

  5. 用端口映射的办法使用矩池云隐藏的vnc功能

    矩池云隐藏了很多高级功能待用户去挖掘. 租用机器 进入jupyterlab 设置vnc密码 VNC_PASSWD="userpasswd" ./root/vnc_startup.s ...

  6. layui 数据表格的使用(分页+总条数)

    下载地址 https://www.layui.com/ 点击实例,找到layui适合模板 2. 新建html将代码复制到对应模板,修改对应样式路径. 5.修改对应参数(url,field) 追加以下参 ...

  7. tp5 多文件上传

    路由: Route::post('imgs','task/task/uploads'); 控制器代码: // 多文件上传 public function uploads() { //接受参数 $dat ...

  8. Laravel 自定命令以及生成文件

    以创建service层为例子 1.执行命令 php artisan make:command ServiceMakeCommand 2.在app\Console\Commands 下就会多出一个 Se ...

  9. LGP6144题解

    冲了50分钟外加10分钟厕所才冲出来,请问我还有救吗. 看上去像是金组题目的加强版,实际上是金组题目的魔改版. 还是考虑像弱化版那样按照左端点排序,并且记录答案的 \(0\sim k\) 次幂和. 然 ...

  10. 【面经】Python面试的16个高频问题

    (一)Python 是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 ⒈对象的引用计数机制 Python 内部使用引用计数,来保持追踪内存中的对象,所有对 ...