Сериализация LocalDateTime в службе отдыха Spring Boot HATEOAS

Я сталкиваюсь со следующей проблемой: в проекте, использующем Spring Boot, spring-data-jpa и spring-data-rest, для публикации служб отдыха HATEOAS, я хотел бы преобразовать переменную LocalDateTime во что-то вроде "2014-12-20T02:30:00.472"для целей сериализации, то есть я хочу, чтобы ответ, отправленный моему клиенту, всегда содержал этот формат.

Следуя этим и этим предложениям, я использовал эти аннотации в своем классе моделей:

public class Order {
    ...
    @JsonSerialize(using = LocalDateTimeSerializer.class)
    @JsonDeserialize(using = LocalDateTimeDeserializer.class)
    @JsonFormat(shape=JsonFormat.Shape.STRING, pattern="yyyy-MM-dd'T'HH:mm:ss.SSS")
    private LocalDateTime createdAt;
    ...
    getter and setter
}

и это мой интерфейс репозитория:

@RepositoryRestResource(path = "orders", collectionResourceRel = "orders")
public interface IOrderRepository extends JpaRepository<Order, Long> {

}

У меня также есть контроллер для тестирования этих вещей:

@RestController
public class JavaTimeController {

    IOrderRepository repo;
    public JavaTimeController(IOrderRepository repo) {
        super();
        this.repo = repo;
    }

    @RequestMapping("/dblocaldatetime")
    public Order dbLocalDateTime() {
        Order order = repo.findOne(1L);
        return order; 
    }
}

Теперь странная вещь:

  • если я отправлю запрос по URL-адресу " http://localhost:8080/dblocaldatetime", тогда мой тестовый контроллер получит заказ с id=1, и будет показан правильный формат даты и времени (т. е. "2014-12-20T02:30:00,472"); Стоит заметить, что в этом случае ресурс возвращается в форме "не-HATEOAS", то есть он не имеет украшения "_link" или "_embedded"
  • запрашивая остальной URI " http://localhost:8080/orders/1", я получаю ответ HATEOAS, но на этот раз формат datetime выглядит примерно так:"createdAt" : { "year" : 2010, "month" : "JANUARY", "dayOfMonth" : 1, "dayOfWeek" : "FRIDAY", "dayOfYear" : 1, "monthValue" : 1, "hour" : 2, "minute" : 2, "second" : 0, "nano" : 0, "chronology" : { "id" : "ISO", "calendarType" : "iso8601" } }

Почему это происходит? Я думаю, что что-то происходит в процессе построения ответа HATEOAS, но я не могу продолжить расследование: как я мог? Любая помощь будет оценена.

1 ответ

В конце концов, я обнаружил, в чем проблема: просто проблема с грязным браузером и кешем; по какой-то причине при изменении разных настроек я всегда получал один и тот же результат, и казалось, что с HATEOAS была проблема; Очистка кеша браузера решила проблему.

Следуя предложению @Cepr0, также обнаружил, что достаточно использовать только аннотацию @JsonFormat; поэтому нет необходимости в аннотациях @JsonSerialize(using = LocalDateTimeSerializer.class) и @JsonDeserialize(using = LocalDateTimeDeserializer.class).

Другие вопросы по тегам