Java中@DateTimeFormat @JsonFormat失效原因及测试填坑

 更新时间:2023年06月26日 09:35:50   作者:liuec1002  
本文主要介绍了Java中@DateTimeFormat @JsonFormat失效原因及测试填坑,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、时间传值

前端时间控件,一般情况下直接会传一个yyyy-MM-dd的日期字符串到后台。这个时候如果我们直接用java.util.Date类型就无法正确接收到。或者我们从数据库里查到DateTime类型并且用java的Date类型接收并返回给前台的时候,前台也无法用yyyy-MM-dd的形式进行呈现。这个时候,前面两种情况分别对应了@DateTimeFormat和@JsonFormat注解的使用。

二、@DateTimeFormat

该注解主要解决前端时间控件传值到后台接收准确的Date类属性的问题,我们可以在需要接收的类中对应的时间类型属性上加上@DateTimeFormat注解,并在注解中加上pattern属性,例如:

/**
 * @author liu
 * @date 2022年04月14日 16:31
 */
@Data
public class User {
    private String createTime;
    private String orderTime;
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
   // @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    //@DateFormatValidation(format = "yyyy-MM-dd HH:mm:ss", message = "与要求的日期格式[yyyy-MM-dd HH:mm:ss]不符")
    private LocalDateTime genTime;
}

三、@JsonFormat

同样,我们在对应的接收对象时间类型上加上@JsonFormat注解,并在注解中加上pattern属性以及timezone属性

例如

/**
 * @author liu
 * @date 2022年04月14日 16:31
 */
@Data
public class User {
    private String createTime;
    private String orderTime;
   // @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    //@DateFormatValidation(format = "yyyy-MM-dd HH:mm:ss", message = "与要求的日期格式[yyyy-MM-dd HH:mm:ss]不符")
    private LocalDateTime genTime;
}

@DateTimeFormat使用场景

@DateTimeFormat只会在类似@RequestParam的请求参数(url拼接的参数才生效)上生效,如果@DateTimeFormat放到@RequestBody下是无效的。

@JsonFormat使用场景

在@RequestBody中则可以使用@JsonFormat把传给后台的时间字符串转成Date,也就是说**@JsonFormat其实既可以把传给后台的时间字符串转成Date也可以把后台传出的Date转成时间字符串**。

通常情况下@RequestBody用的比较多演示@JsonFormat使用场景

代码

/**
 * @author liu
 * @date 2022年04月14日 16:31
 */
@Data
public class User {
    private String createTime;
    private String orderTime;
   // @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
   @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    //@DateFormatValidation(format = "yyyy-MM-dd HH:mm:ss", message = "与要求的日期格式[yyyy-MM-dd HH:mm:ss]不符")
    private LocalDateTime genTime;
}

传输对象

/**
 * @author liu
 * @date 2022年04月26日 10:42
 */
@Data
public class UserSaveDto {
    private  String code;
    private List<User> list ;
}

用apiPost测试时测试字符串

{
“code”: “11”,
“list”: [
{
“createTime”: “aa”,
“orderTime”: “xx”,
“genTime”: “2022-04-26 15:17:59”
}
]
}

看似没有问题但后台一直报错

2022-04-26 15:50:22.423 WARN 39112 — [nio-9090-exec-6] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot deserialize value of type java.time.LocalDateTime from String “2022-04-26 15:17:59”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2022-04-26 15:17:59’ could not be parsed at index 11; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.time.LocalDateTime from String “2022-04-26 15:17:59”: Failed to deserialize java.time.LocalDateTime: (java.time.format.DateTimeParseException) Text ‘2022-04-26 15:17:59’ could not be parsed at index 11 at [Source: (org.springframework.util.StreamUtils$NonClosingInputStream); line: 1, column: 68] (through reference chain: com.example.demo.test.UserSaveDto[“list”]->java.util.ArrayList[0]->com.example.demo.test.User[“genTime”])]

时间格式还是不准确,可能我们考虑是不是注解不好用,错了,是你的json字符串有问题

必须是json格式化出来的字符串

json工具类

package com.example.demo.test;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import java.text.SimpleDateFormat;
/**
 * @author liu
 * @date 2022年04月26日 15:02
 */
public class JsonUtils {
    /**
     * 功能描述: 重载方法,只传入一个object就可以,默认的日期格式就是"yyyy-MM-dd HH:mm:ss"
     * @return java.lang.String
     */
    public static String getJson(Object object) {
        return getJson(object, "yyyy-MM-dd HH:mm:ss");
    }
    //静态方法,拿来即用,日期就输入格式,不是日期就调用上面的,就日期格式也不影响
    public static String getJson(Object object, String dateformat) {
        ObjectMapper mapper = new ObjectMapper();
        mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        mapper.registerModule(new JavaTimeModule());
        //不使用时间差的方式  WRITE_DATE_KEYS_AS_TIMESTAMPS:将日期键作为时间戳写入 改为false
        mapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false);
        SimpleDateFormat format = new SimpleDateFormat(dateformat);
        //指定日期格式
        mapper.setDateFormat(format);
        try {
            //就是不是日期对象也不影响,都是正常调用了writeValueAsString方法
            return mapper.writeValueAsString(object);
        } catch (JsonProcessingException e) {
            e.printStackTrace();
        }
        //如果有异常,就返回null
        return null;
    }
}

格式化出来的字符串

{
“code”: “11”,
“list”: [
{
“createTime”: “aa”,
“orderTime”: “xx”,
“genTime”: “2022-04-26 15:17:59”
}
]
}

然后再发请求

响应

[User(createTime=aa, orderTime=xx, genTime=2022-04-26T15:17:59)]

 到此这篇关于Java中@DateTimeFormat @JsonFormat失效原因及测试填坑的文章就介绍到这了,更多相关Java @DateTimeFormat @JsonFormat失效内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中Date类和Strng类的灵活转化

    java中Date类和Strng类的灵活转化

    这篇文章主要介绍了java中Date类和Strng类的灵活转化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Java老矣 尚能饭否?

    Java老矣 尚能饭否?

    Java老矣,尚能饭否?各类编程语言横空出世,纷战不休,然而 TIOBE 的语言排行榜上,Java 却露出了明显的颓势。这个老牌的语言,未来会是怎样?
    2017-06-06
  • SpringBoot全局配置long转String丢失精度的问题解决

    SpringBoot全局配置long转String丢失精度的问题解决

    web项目中,Java后端传过来的Long/long类型,前端JS接收会丢失精度。那么应该如何解决,本文就来介绍一下几种方法,感兴趣的可以了解一下
    2021-08-08
  • java中的编码转换过程(以utf8和gbk为例)

    java中的编码转换过程(以utf8和gbk为例)

    这篇文章主要介绍了java中的编码转换过程(以utf8和gbk为例),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • spring boot中使用@Async实现异步调用任务

    spring boot中使用@Async实现异步调用任务

    本篇文章主要介绍了spring boot中使用@Async实现异步调用任务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-02-02
  • Java实现游戏飞机大战-III的示例代码

    Java实现游戏飞机大战-III的示例代码

    这篇文章主要为大家介绍了如何利用Java实现经典的游戏之飞机大战,文中采用了swing技术进行了界面化处理,感兴趣的小伙伴可以动手试一试
    2022-02-02
  • Java中的static的使用指南

    Java中的static的使用指南

    本文给大家简单总结了下java中的static的使用注意事项及方法,非常的实用,有需要的小伙伴可以参考下
    2016-04-04
  • JAVA中堆、栈,静态方法和非静态方法的速度问题

    JAVA中堆、栈,静态方法和非静态方法的速度问题

    这篇文章主要介绍了JAVA中堆、栈,静态方法和非静态方法的速度问题,堆和栈得速度性能分析多角度给大家分析,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • Java 二维码,QR码,J4L-QRCode 的资料整理

    Java 二维码,QR码,J4L-QRCode 的资料整理

    本文主要介绍Java 中二维码,QR码,J4L-QRCode,这里整理了详细的资料供大家学习参考关于二维码的知识,有需要的小伙伴可以参考下
    2016-08-08
  • 使用springboot开发的第一个web入门程序的实现

    使用springboot开发的第一个web入门程序的实现

    这篇文章主要介绍了使用springboot开发的第一个web入门程序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论