1. 程式人生 > >Springboot框架下Date型別資料上傳問題

Springboot框架下Date型別資料上傳問題

問題場景:

使用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")