2017-05-03 4 views
2

Ich mache eine REST-API mit einem Angular2-Frontend. In meiner Spring-Konfiguration für Jackson habe ich diese spring.jackson.date-format=EEE MMM dd yyyy HH:mm:ss zzz (zzzz) eingestellt, weil ich das Bootstrap-Datepicker-Plugin verwende, das Daten wie folgt ausgibt: Wed May 31 2017 00:00:00 GMT+0200 (W. Europe Daylight Time). Wenn ich versuche, ein Datum an ein DTO zu senden, das über Variablen wie diese verfügt private Date defaultDatetime; Die REST-API gibt einen Fehler 400 Fehlgeschlagen zurück.Angular2 Spring Boot Datum Serialisierung

{"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"} 

Irgendwelche Idee, welche Art von Format sollte ich für jackson deserializatrion setzen? Oder sollte ich das Format direkt im Frontend ändern?

aktualisieren

Ich habe es mit einem benutzerdefinierten Serializer arbeiten. Dies ist die Konfiguration in der Eigenschaftendatei.

spring.jackson.date-format = ch.heigvd.form.configuration.CustomJsonDateDeserializer spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS = false

Dies ist der Serializer:

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

Ich bin ziemlich sicher, dass boostrsrap-datepicker js 'Date()' Objekt zurückgibt. Wenn Sie eine Backend-Anfrage machen, wird 'JSON.stringify (date)' gemacht, die den String als '" 2017-05-03T15: 07: 34.056Z "' zurückgibt. Das Gleiche zeigt sich in der Fehlermeldung, die Sie erhalten haben. Setze also das Jackson-Format, um dieses Format analysieren zu können. –

Antwort

1

Sie können eine der beiden Optionen Option 1: tun, da ISOFormat zurückgegeben wird, schreiben Sie Ihren eigenen Deserializer.

@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); 
     } 

    } 
} 

Beschriften jeder Setter überall mit

@JsonDeserialize(using = CustomJsonDateDeserializer.class) 

Option 2: ändern Format ISO String-Format entsprechen.

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

Ich habe Option 2 versucht, aber ich habe immer noch einen Fehler zuerst. Ich änderte die Eigenschaft zu 'spring.jackson.date-format = JJJJ-MM-dd'T'HH: mm: ss.SSS'Z'' und es scheint jetzt zu funktionieren. Vielen Dank! – Servietsky

+0

Entschuldigung ich verpasste die Zitate in T & Z, aktualisiert :) –

+0

Ich habe gerade festgestellt, dass das Datum deserialized von Jackson ist nicht das gleiche wie die angegebene. Wenn das Frontend "2017-05-16T22: 00: 00.000Z" sendet, deserialisiert es es immer an "2017-01-02T23: 00: 00.000Z". Soll ich Option 1 ausprobieren? – Servietsky