Springbootフレームワークの下でDateタイプのデータアップロードの問題

2522 ワード

質問シーン:
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))
at [Source: java.io.PushbackInputStream@6317f037; line: 9, column: 11] (through reference chain: com.consmation.iwebmapserver.projectserver.model.BusGeologicalDrilling[\"fixdt\"])", "path": "/MobileServer/SaveGeologicalDrillingInfo" }

このエラーは、解析できない日付"2016-08-15 17:00:00":yyy-MM-dd'HH:mm:ss.SSS”
2.この時点でアップロードしたDateデータを2016-08-15 T 16: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")