2017-05-03 1 views
2

저는 Angular2 프론트 엔드로 REST API를 만들고 있습니다. 잭슨에 대한 내 봄 구성에서 나는 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 개의 잘못된 요청 오류를 반환합니다.Angular2 봄 부팅 날짜 직렬화

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

어떤 종류의 날짜 형식을 내가 jackson deserializatrion에 넣어야하는지 알고 싶습니다. 또는 프런트 엔드에서 형식을 직접 변경해야합니까?

업데이트

나는 그것이 사용자 정의 직렬화 작업을 얻었다. 이것이 특성 파일의 구성입니다.

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
:

이 거짓

spring.jackson.date 포맷 = ch.heigvd.form.configuration.CustomJsonDateDeserializer spring.jackson.serialization.WRITE_DATES_AS_TIMESTAMPS는 = 시리얼이며

옵션 1 : 중 하나를 수행 할 수 있습니다. ISOFormat을 반환하므로 사용자 고유의 비 직렬화기를 작성하십시오.

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

    } 
} 

주석

@JsonDeserialize(using = CustomJsonDateDeserializer.class) 

옵션 2와 사방 각 세터 : 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