Springboot框架下Date型別資料上傳問題
阿新 • • 發佈:2019-01-06
問題場景:
使用Springboot框架搭建服務,實現如下需求, 服務端使用實體類接收客戶端上傳具有相同結構的json資料資訊,其中實體類的屬性欄位中包含java.util.Date型別的屬性欄位。
問題描述:
1.由客戶端上傳的json資料中Date欄位格式為“2016-08-15 17:00:00”,測試呼叫時報如下錯誤:
{
"timestamp": 1521217111334,
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "JSON parse error: Can not deserialize value of type java.util.Date from String \"2016-08-15 17:00:00\": not a valid representation (error: Failed to parse Date value '2016-08-15 17:00:00': Can not parse date \"2016-08-15 17:00:00\": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS', parsing fails (leniency? null)); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.util.Date from String \"2016-08-15 17:00:00\": not a valid representation (error: Failed to parse Date value '2016-08-15 17:00:00': Can not parse date \"2016-08-15 17:00:00\": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSS', parsing fails (leniency? null))\n at [Source: [email protected]; line: 9, column: 11] (through reference chain: com.consmation.iwebmapserver.projectserver.model.BusGeologicalDrilling[\"fixdt\"])",
"path": "/MobileServer/SaveGeologicalDrillingInfo"
}
該錯誤大意為:不能解析日期\“2016-08-15 17:00:00 \”:雖然它似乎符合格式的yyyy-MM-dd 'HH:mm:ss.SSS”
2.此時將上傳的Date資料修改為 2016-08-15T16:00:00 ,程式雖不再報錯誤,但是通過跟蹤程式實體類發現,該欄位的值為:2016-08-16 1:00:00,不符合我們所上傳的日期。
錯誤分析:
1. Springboot使用的預設json解析框架是jackjson框架
2. jackjson解析框架在解析實體類裡面是date資料型別的資料時的預設格式是:UTC型別,即yyyy-MM-dd'T'HH:mm:ss.SSS 並且預設為+8時區,即時間基礎上加8小時
解決方案:
1. 在實體Date型別的欄位上使用@JsonFormat註解格式化日期
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
2. 通過下面方式取消timestamps形式objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
備註:
如果專案中使用json解析框架為fastjson框架,則可使用如下解決方法:1. 在實體欄位上使用@JsonFormat註解格式化日期
@JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd HH:mm:ss")