Spring Data Rest возвращает даты в миллисекундном формате - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть объект с датами (java.util.Date) поля, определенные таким образом:

@Temporal(TemporalType.TIMESTAMP)
private Date fechaInicio;

@Temporal(TemporalType.TIMESTAMP)
private Date fechaFin;

У меня есть RestController для получения объектов, проблема в формате iполучаю миллисекунды для дат:

{"id":1,"tipoPlanId":320,"precio":155000.0,
"cantidad":6,"fechaInicio":1546300800000,"fechaFin":1551312000000}

Я не знаю, почему не возвращается формат даты по умолчанию для остальных данных Spring "2019-02-10T06: 15: 16.000 + 0000"

Спасибо за вашу помощь.

Ответы [ 4 ]

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

Во-первых, я настоятельно рекомендую использовать java.time.LocalDateTime / java.time.LocalDate вместо java.util.Date (обработка часовых поясов является кошмаром при использовании java.util.Date, и вы можете ошибочно вставитьдата / время в вашей базе данных), форматирование даты с использованием @JsonFormat может решить только проблему с форматированием, но вы можете столкнуться с несоответствием данных при обработке значения даты / времени.

Если вы используете SpringBoot, в Spring Context зарегистрирован зарегистрирован форматтер, используемый для обработки LocalDate / LocalDateTime, и вы можете использовать этот тип данных без каких-либо изменений в вашей конфигурации.

Теперь, если вы не используете Spring Boot, вам, возможно, придется зарегистрировать форматтер LocalDate / LocalDateTime в вашей конфигурации (см. Этот пост Как зарегистрировать глобальную привязку данных для LocalDate весной mvc? , обратите внимание, что вы должны зарегистрировать тип LocalDateTime для отметок времени )

Обработка даты / времени не является простой задачей в Rest / Spring, но, поверьте мне, если вы реализуете LocalDate или LocalDateTime, вы не будетесломайте голову, пытаясь выяснить, что не так с некоторыми датами / временными метками, которые вставлены с неверными значениями в базу данных.

Примеры классов

DTO

public class Cookie {
    private long id;
    private LocalDateTime expirationDate;

    //Getters/setters and other stuff

}

Контроллер

@RestController
@RequestMapping("/chocolateCookies")
public class ChocolateCookieApi extends CookieApi<ChocolateCookie> {

    @GetMapping("/{cookieId}")
    public ResponseEntity<Cookie> findCookie(@PathVariable long cookieId) {
        final Cookie cookie = new Cookie();
        cookie.setId(cookieId);
        cookie.setExpirationDate(LocalDateTime.now().plusWeeks(4));
        return new ResponseEntity<>(cookie, HttpStatus.OK);
    }

    //Other cookie stuff

}

Проверка конечной точки

enter image description here

Код доступен в GitHub https://github.com/karl-codes/cookie-monster

Удачного кодирования!

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

Вы можете изменить его в классе getter, когда Spring выбирает открытые поля и методы, или сохранить его как TemporalType.DATE.

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

Я использую Spring 2.x и для меня Date возвращается в правильном формате.Однако вы также можете принудительно применить его:

  • Добавив spring.jackson.serialization.write-dates-as-timestamps=false в свой файл свойств
  • или пометив переменную-член с помощью @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")

Итак, в вашем случае класс будет выглядеть так:

@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date fechaInicio;

@Temporal(TemporalType.TIMESTAMP)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private Date fechaFin;
0 голосов
/ 28 февраля 2019

Моя единственная идея - преобразовать ее в удобочитаемую дату, например:

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss.SSS");
    String humanReadableDate = sdf.format(fechaFin);
...