Почему формат LocalDate изменился, когда я преобразовал сущность в Json? - PullRequest
0 голосов
/ 23 февраля 2019

Моя цель - хранить даты в базе данных.Для этого я использую Springboot, JPA, H2, ...

Я использую LocalDate и желаемый формат: yyyy-MM-dd.

Entity

@Entity
public class MyObject {

    @Id
    private String id;
    private LocalDate startdate;
    private LocalDate enddate;

    public MyObject() {}

    public MyObject(LocalDate enddate) {
        this.startdate = LocalDate.now();
        this.enddate = enddate;
    }

    ...
}

Main

private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
MyObject myObject = new MyObject(LocalDate.parse("2019-03-01", formatter));
myObject.setId(UUID.randomUUID().toString());
myObjectResource.save(myObject);

HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
System.out.println(myObject.getStartdate()); // 2019-02-23
System.out.println(myObject.getEnddate()); // 2019-03-01
HttpEntity<String> entity = new HttpEntity<>(this.toJsonString(myObject), headers);
System.out.println(entity.toString()); // <{"id":"ba6649e4-6e65-4f54-8f1a-f8fc7143b05a","startdate":{"year":2019,"month":"FEBRUARY","dayOfMonth":23,"dayOfWeek":"SATURDAY","era":"CE","dayOfYear":54,"leapYear":false,"monthValue":2,"chronology":{"id":"ISO","calendarType":"iso8601"}},"enddate":{"year":2019,"month":"MARCH","dayOfMonth":1,"dayOfWeek":"FRIDAY","era":"CE","dayOfYear":60,"leapYear":false,"monthValue":3,"chronology":{"id":"ISO","calendarType":"iso8601"}}},[Content-Type:"application/json"]>

private String toJsonString(Object o) throws Exception {
    ObjectMapper om = new ObjectMapper();
    return om.writeValueAsString(o);
}

Можете ли вы помочь мне понять, почему даты в entity.toString() не такие, как раньше, с getMethods()?

Спасибо за помощь!

1 Ответ

0 голосов
/ 23 февраля 2019

LocalDate.parse возвращает новый LocalDate объект.Параметры форматирования, указанные в DateTimeFormatter, теряются в обратном направлении.

Jackson (используемая вами библиотека JSON) не знает, как вы ранее «отформатировали» LocalDate, поэтомуиспользует свое собственное форматирование.

Вы можете зарегистрировать JavaTimeModule

final ObjectMapper om = new ObjectMapper();
om.registerModule(new JavaTimeModule());

Или вы можете предоставить свой пользовательский JsonSerializer<T>.

...