Я прочитал несколько вопросов с ответами здесь в SO относительно сериализации и десериализации между java.time.LocalDateTime
и свойством JSON, но я не могу заставить его работать.
Мне удалось настроить приложение загрузки Spring для возврата дат в желаемом формате (YYY-MM-dd HH:mm
), но у меня проблемы с принятием значений в этом формате в JSON.
Это все, что я сделал до сих пор:
Добавлена зависимость maven для jsr310
:
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
Указано jsr310
в моем основном классе:
@EntityScan(basePackageClasses = { App.class, Jsr310JpaConverters.class })
Отключена сериализация как временные метки в application.properties
:
spring.jackson.serialization.write_dates_as_timestamps=false
И это мое сопоставление сущности для datetime:
@Column(name = "start_date")
@DateTimeFormat(iso = DateTimeFormat.ISO.TIME)
@JsonFormat(pattern = "YYYY-MM-dd HH:mm")
private LocalDateTime startDate;
В моей базе данных я храню эту дату как TIMESTAMP в следующем формате: 2016-12-01T23:00:00+00:00
.
Если я получаю доступ к этому объекту через мой контроллер, он возвращает JSON с правильным форматом startDate. Когда я пытаюсь опубликовать его и десериализую его, используя формат YYYY-MM-dd HH:mm
, я получаю следующее исключение:
{
"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"
}
Я знаю, что есть много ответов на эту тему, но после них и попытки в течение нескольких часов не помогли мне разобраться, что я делаю неправильно, поэтому я был бы рад, если бы кто-нибудь мог указать мне, что мне не хватает, Спасибо за любой вклад в этом!
EDIT: Это все классы, участвующие в процессе:
Repository:
@Repository
public interface EventRepository extends PagingAndSortingRepository<Event, Long> {
}
Контроллер:
@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Event> createEvent(@RequestBody Event event) {
return new ResponseEntity<>(eventRepo.save(event), HttpStatus.CREATED);
}
My JSON запрашивает payalod:
{
"name": "Test",
"startDate": "2017-01-01 20:00"
}
Событие:
@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;
}