本文分析前后端時間數據類型不一致問題,并提供具體的解決方案。問題根源在于后端返回的時間數據類型與前端預期類型不符,導致前端無法直接處理。
后端使用Java的timestamp類型和mysql的datetime類型存儲時間,前端typescript定義createtime和updatetime為number類型。然而,前端接收到的res.icons[0].createtime卻是字符串,而非預期的時間戳數字。
問題原因在于TypeScript的Interface僅為類型定義,缺乏Java POJO類的反射能力,無法自動將json字符串轉換為數字。即使在TypeScript中定義createtime為number類型,如果后端返回的JSON數據中createtime是字符串,前端接收到的數據仍然是字符串。因此,interface的定義必須與實際返回的JSON數據類型一致。 最佳實踐是將前端icon接口中的createtime和updatetime類型修改為String或Date類型,以匹配后端返回的數據。
為了讓后端返回時間戳,可以使用Jackson庫的@JsonFormat注解或spring的@DateTimeFormat注解。
使用@JsonFormat注解:
通過指定shape為JsonFormat.Shape.NUMBER,可以將時間數據序列化為時間戳數字:
@JsonFormat(shape = JsonFormat.Shape.NUMBER) private Date date;
使用@DateTimeFormat注解:
通過指定ISO屬性,可以控制時間格式,同樣可以實現返回時間戳的目的:
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) private Date date;
通過以上方法,后端可將時間數據格式化為時間戳,解決前端時間數據類型不一致的問題。前端也需要根據后端實際返回的數據類型調整icon接口定義。