Java中@DateTimeFormat @JsonFormat失效原因及測試填坑
一、時間傳值
前端時間控件,一般情況下直接會傳一個yyyy-MM-dd的日期字符串到后臺。這個時候如果我們直接用java.util.Date類型就無法正確接收到?;蛘呶覀儚臄?shù)據(jù)庫里查到DateTime類型并且用java的Date類型接收并返回給前臺的時候,前臺也無法用yyyy-MM-dd的形式進行呈現(xiàn)。這個時候,前面兩種情況分別對應了@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的請求參數(shù)(url拼接的參數(shù)才生效)上生效,如果@DateTimeFormat放到@RequestBody下是無效的。
@JsonFormat使用場景
在@RequestBody中則可以使用@JsonFormat把傳給后臺的時間字符串轉(zhuǎn)成Date,也就是說**@JsonFormat其實既可以把傳給后臺的時間字符串轉(zhuǎn)成Date也可以把后臺傳出的Date轉(zhuǎn)成時間字符串**。
通常情況下@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”,
“l(fā)ist”: [
{
“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.LocalDateTimefrom 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 typejava.time.LocalDateTimefrom 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");
}
//靜態(tài)方法,拿來即用,日期就輸入格式,不是日期就調(diào)用上面的,就日期格式也不影響
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 {
//就是不是日期對象也不影響,都是正常調(diào)用了writeValueAsString方法
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
//如果有異常,就返回null
return null;
}
}格式化出來的字符串
{
“code”: “11”,
“l(fā)ist”: [
{
“createTime”: “aa”,
“orderTime”: “xx”,
“genTime”: “2022-04-26 15:17:59”
}
]
}然后再發(fā)請求
響應
[User(createTime=aa, orderTime=xx, genTime=2022-04-26T15:17:59)]

到此這篇關于Java中@DateTimeFormat @JsonFormat失效原因及測試填坑的文章就介紹到這了,更多相關Java @DateTimeFormat @JsonFormat失效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot3實現(xiàn)上傳圖片并返回路徑讓前端顯示圖片
這篇文章主要介紹了SpringBoot3實現(xiàn)上傳圖片并返回路徑讓前端顯示圖片,文中通過圖文和代碼講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2024-12-12
java 中數(shù)據(jù)庫連接的JDBC和驅(qū)動程序的深入分析
這篇文章主要介紹了java 中數(shù)據(jù)庫連接的JDBC和驅(qū)動程序的深入分析的相關資料,需要的朋友可以參考下2017-04-04
MyBatis注解方式之@Update/@Delete使用詳解
這篇文章主要介紹了MyBatis注解方式之@Update/@Delete使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-11-11
使用自定義注解和@Aspect實現(xiàn)責任鏈模式的組件增強的詳細代碼
責任鏈模式是一種行為設計模式,其作用是將請求的發(fā)送者和接收者解耦,從而可以靈活地組織和處理請求,本文講給大家介紹如何使用自定義注解和@Aspect實現(xiàn)責任鏈模式的組件增強,文中有詳細的代碼示例供大家參考,感興趣的同學可以借鑒一下2023-05-05
Spring實現(xiàn)動態(tài)修改時間參數(shù)并手動開啟關停操作
spring實現(xiàn)定時任務的方式有三種,分別是java自帶的timer類、spring task和quartz三種。本文只介紹spring自帶的task和第三方quartz,感興趣的朋友參考下吧2017-09-09

