Przeczytałem kilka pytań z odpowiedziami tutaj w SO dotyczących serializacji i deserializacji między java.time.LocalDateTime
i własności JSON, ale nie mogę sprawić, żeby to działało.Deserialize Java 8 LocalDateTime z JacksonMapper
Udało mi się skonfigurować moją aplikację Spring Boot, aby zwrócić daty w żądanym formacie (YYY-MM-dd HH:mm
), ale mam problemy z akceptacją wartości w tym formacie w JSON.
Są to wszystko rzeczy, zrobiłem do tej pory:
Dodany zależność Maven dla jsr310
:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
określono jsr310
w moim główne klasy:
@EntityScan(basePackageClasses = { App.class, Jsr310JpaConverters.class })
serializacji niepełnosprawnych jako znaczników czasu w application.properties
:
spring.jackson.serialization.write_dates_as_timestamps=false
A to moja jednostka mapowania dla datetime:
@Column(name = "start_date")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
@JsonFormat(pattern = "YYYY-MM-dd HH:mm")
private LocalDateTime startDate;
W mojej bazy danych, przechowywać tę datę jako znacznikiem czasu w następującym formacie: 2016-12-01T23:00:00+00:00
.
Jeśli dostęp do tej jednostki za pośrednictwem kontrolera, zwraca JSON z poprawnym formatem startDate. Kiedy próbuję opublikować i deserializować go jednak, przy użyciu formatu YYYY-MM-dd HH:mm
, pojawia się następujący wyjątek:
{
"timestamp": "2016-10-30T14:22:25.285+0000",
"status": 400,
"error": "Bad Request",
"exception": "org.springframework.http.converter.HttpMessageNotReadableException",
"message": "Could not read document: Can not deserialize value of type java.time.LocalDateTime from String \"2017-01-01 20:00\": Text '2017-01-01 20:00' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=1, WeekBasedYear[WeekFields[SUNDAY,1]]=2017, DayOfMonth=1},ISO resolved to 20:00 of type java.time.format.Parsed\n at [Source: [email protected]; line: 6, column: 16] (through reference chain: com.gigsterous.api.model.Event[\"startDate\"]); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.time.LocalDateTime from String \"2017-01-01 20:00\": Text '2017-01-01 20:00' could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MonthOfYear=1, WeekBasedYear[WeekFields[SUNDAY,1]]=2017, DayOfMonth=1},ISO resolved to 20:00 of type java.time.format.Parsed\n at [Source: [email protected]; line: 6, column: 16] (through reference chain: com.gigsterous.api.model.Event[\"startDate\"])",
"path": "/api/events"
}
wiem, że istnieje wiele odpowiedzi dotyczące tego tematu, ale po nich i próbuje na kilka godzin nie pomogło mnie, aby dowiedzieć się, co robię źle, więc byłbym zadowolony, gdyby ktoś mógł mi wskazać, czego mi brakuje. Dzięki za wszelkie dane na ten temat!
EDIT: Są to wszystkie klasy biorące udział w procesie:
Repozytorium:
Kontroler:
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Event> createEvent(@RequestBody Event event) {
return new ResponseEntity<>(eventRepo.save(event), HttpStatus.CREATED);
}
Moja prośba JSON payalod:
{
"name": "Test",
"startDate": "2017-01-01 20:00"
}
Przeddzień nt:
@Entity
@Table(name = "events")
@Getter
@Setter
public class Event {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "event_id")
private long id;
@Column(name = "name")
private String name;
@Column(name = "start_date")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
@JsonFormat(pattern = "YYYY-MM-dd HH:mm")
private LocalDateTime startDate;
}
Czy możesz podzielić się resztą śladu, abyśmy wszyscy mogli sprawdzić, które klasy są zaangażowane w analizowanie wartości? Również Adnotacja DateTimeFormat wygląda na miejscu – Ivan
@Ivan Dodałem wszystkie informacje do mojego pytania i zaktualizowałem śledzenie – Smajl