国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > 建站經驗 > 正文

徹底解決Spring mvc中時間的轉換和序列化等問題

2019-11-02 14:09:13
字體:
來源:轉載
供稿:網友

痛點

在使用Spring mvc 進行開發時我們經常遇到前端傳來的某種格式的時間字符串無法用java8的新特性java.time包下的具體類型參數來直接接收。 我們使用含有java.time封裝類型的參數接收也會報反序列化問題,在返回前端帶時間類型的同樣會出現一些格式化的問題。今天我們來徹底解決他們。

建議

其實最科學的建議統一使用時間戳來代表時間。這個是最完美的,避免了前端瀏覽器的兼容性問題,同時也避免了其它一些中間件的序列化/反序列化問題。但是用時間表達可能更清晰語義化。兩種方式各有千秋,如果我們堅持使用java8的時間類庫也不是沒有辦法。下面我們會以java.time.LocalDateTime為例逐一解決這些問題。

局部注解方式

網上有很多文章說該注解是前端指向后端的,也就是前端向后端傳遞時間參數格式化使用的,這沒有錯!但是有一個小問題,該方式只能適用于不涉及反序列化的情況下。也就是以下場景才適用:

  @GetMapping("/local")  public Map<String, String> data(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") LocalDateTime localDateTime) {    Map<String, String> map = new HashMap<>(1);    map.put("data", localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));    return map;  }

如果你在下面這個場景使用就不行了:

@Datapublic class UserInfo {  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")  private LocalDateTime birthday;  private String name;  private Integer age;}  @PostMapping("/user")  public Object postData(@RequestBody UserInfo userInfo) {    System.out.println("userInfo = " + userInfo);    return userInfo;  }

原因是Post請求參數在body中,需要反序列化成對象。默認是jackson類庫來進行反序列化,并不觸發@DateTimeFormat注解機制。這時我們就需要使用jackson的格式化注解@JsonFormat。我們將實體類UserInfo改造成下面的就可以了:

@Datapublic class UserInfo {  @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")  private LocalDateTime birthday;  private String name;  private Integer age;}

以上兩個注解可以并存,但是一定要清楚各自的使用場景。這里還有一個小細節:格式一定要對應好時間類型。比如yyyy-MM-dd 對應java.time.LocalDate 。想再個性化一些@JsonFormat 可以被@JsonDeserialize和@JsonSerialize 代替。但是它們的using參數需要你自己實現為你對應的時間類型類型。如果@JsonFormat、@JsonDeserialize和@JsonSerialize同時存在@JsonFormat的優先級要更高。

局部處理的好處

局部處理的好處在于八個字:百花齊放,百家爭鳴 ??梢员3侄鄻有?、個性化 。但是局部帶來了一個新的問題 :沒有共同的標準 、不兼容。進而不方便維護。所以有時候基于業務需要我們全局化可以統一管理。下面我們將講解如何進行全局化配置。

全局化化時間格式配置

全局化其實也是基于 @DateTimeFormat 和@JsonFormat 兩種場景來進行配置。對于@DateTimeFormat的場景我們通過實現Spring提供的接口:

DateTimeFormatter :   // 時間格式化  private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.CHINA);
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 柯坪县| 咸宁市| 冷水江市| 任丘市| 赣榆县| 穆棱市| 定陶县| 靖安县| 巴里| 淳安县| 潞城市| 庆阳市| 云南省| 龙井市| 沾益县| 阳新县| 高邑县| 黄冈市| 蓬安县| 高雄市| 肃北| 山阳县| 上林县| 余姚市| 汶川县| 庆安县| 海口市| 西乌珠穆沁旗| 杭锦后旗| 开远市| 同仁县| 尼木县| 罗甸县| 宁陕县| 云梦县| 尚义县| 清远市| 新河县| 天门市| 辉县市| 盖州市|