2017-05-03 7 views
2

私はAngular2フロントエンドでREST APIを作成しています。私のSpring設定では、spring.jackson.date-format=EEE MMM dd yyyy HH:mm:ss zzz (zzzz)を設定しています。これは、bootstrap-datepickerプラグインを使用しているため、次のような日付を出力します。Wed May 31 2017 00:00:00 GMT+0200 (W. Europe Daylight Time)。 このような変数を持つDTOに日付を投稿しようとすると、private Date defaultDatetime; REST APIは400 Bad Requestエラーを返します。Angular2 Spring起動日のシリアル化

{"timestamp":"mer. mai 03 2017 14:16:47", 
"status":400, 
"error":"Bad Request", 
"exception":"org.springframework.http.converter.HttpMessageNotReadableException", 
"message":"Could not read document: Can not construct instance of java.util.Date from String value '2017-05-01T22:00:00.000Z': not a valid representation (error: Failed to parse Date value '2017-05-01T22:00:00.000Z': Unparseable date: \"2017-05-01T22:00:00.000Z\")\n at [Source: [email protected]; line: 1, column: 68] (through reference chain: ch.heigvd.form.api.dto.FormDTO[\"fields\"]->java.util.ArrayList[0]->ch.heigvd.form.api.dto.field.DateFieldDTO[\"defaultDate\"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not construct instance of java.util.Date from String value '2017-05-01T22:00:00.000Z': not a valid representation (error: Failed to parse Date value '2017-05-01T22:00:00.000Z': Unparseable date: \"2017-05-01T22:00:00.000Z\")\n at [Source: [email protected]; line: 1, column: 68] (through reference chain: ch.heigvd.form.api.dto.FormDTO[\"fields\"]->java.util.ArrayList[0]->ch.heigvd.form.api.dto.field.DateFieldDTO[\"defaultDate\"])", 
"path":"/api/forms"} 

ジャクソン・デシリアリザリトーションにはどのような日付形式を入れるべきですか?または、フロントエンドで直接形式を変更する必要がありますか?

更新

私はそれがカスタム・シリアライザと協力しました。これはプロパティー・ファイルの構成です。

spring.jackson.date形式= ch.heigvd.form.configuration.CustomJsonDateDeserializer spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = falseを

これはシリアライザです:

public class CustomJsonDateDeserializer extends ISO8601DateFormat { 

    @Override 
    public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) { 
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
     toAppendTo.append(format.format(date)); 
     return toAppendTo; 
    } 

    @Override 
    public Date parse(String source, ParsePosition pos) { 
     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'"); 
     try { 
      return format.parse(source); 
     } catch (ParseException var4) { 
      return null; 
     } 
    } 

} 
+1

boostrsrap-datepickerがjs 'Date()'オブジェクトを返すことは間違いありません。バックエンド要求を行うと 'JSON.stringify(date)'となり、文字列は '" 2017-05-03T15:07:34.056Z "'として返されます。同じエラーメッセージが表示されます。そのようなフォーマットを解析できるようにJacksonフォーマットを設定します。 –

答えて

1

オプション1: のいずれかのオプションを使用できます。これはISOFormatを返すので、独自のデシリアライザを作成します。

@JsonDeserialize(using = CustomJsonDateDeserializer.class) 

オプション2でどこでも

@JsonDeserialize(using=CustomerDateAndTimeDeserialize .class) 
public class CustomJsonDateDeserializer extends JsonDeserializer<Date> 
{ 
    @Override 
    public Date deserialize(JsonParser jsonparser, 
      DeserializationContext deserializationcontext) throws IOException, JsonProcessingException { 

     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
     String date = jsonparser.getText(); 
     try { 
      return format.parse(date); 
     } catch (ParseException e) { 
      throw new RuntimeException(e); 
     } 

    } 
} 

注釈各セッター: ISO文字列のフォーマットに合わせてフォーマットを変更します。

spring.jackson.date-format=YYYY-MM-dd'T'HH:mm:ss.SSS'Z' 
+0

私はオプション2を試しましたが、最初はまだエラーがあります。私はこのプロパティを 'spring.jackson.date-format = YYYY-MM-dd'T'HH:mm:ss.SSS'Z''に編集しました。ありがとうございました! – Servietsky

+0

私はT&Zで引用符を忘れてしまった: –

+0

私はちょうどジャックソンによって非直列化された日付が与えられたものと同じではないことに気づいた。フロントエンドが '2017-05-16T22:00:00.000Z'を送信すると、それは常に' 2017-01-02T23:00:00.000Z'に逆シリアル化されます。オプション1を試してみるべきですか? – Servietsky

関連する問題