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;
}
}
}
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. –