【问题标题】:LocalDateTime serialization in a Spring Boot HATEOAS rest serviceSpring Boot HATEOAS 休息服务中的 LocalDateTime 序列化
【发布时间】:2017-10-27 00:09:43
【问题描述】:

我面临以下问题:在使用 Spring Boot、spring-data-jpa 和 spring-data-rest 发布 HATEOAS 休息服务的项目中,我想将 LocalDateTime 变量转换为类似“2014- 12-20T02:30:00.472" 用于序列化目的,即我希望发送给我的客户端的响应始终包含该格式。

按照thisthat 的建议,我在我的模型类中使用了这些注释:

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 响应,但这次日期时间格式是这样的: "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 响应的过程中发生了一些事情,但我无法进一步调查:我怎么能? 任何帮助将不胜感激。

【问题讨论】:

  • 我建议使用Instant instead of LocalDateTime。另外,不要忘记在 gradle/maven 配置文件中添加 jackson-datatype-jsr310 依赖项。
  • 谢谢@mark,您的回答。我已经添加了 jackson-datatype-jsr310 依赖项,所以我能够获得我想要的格式,至少在某些情况下,即没有构建 HATEOAS 响应时。在另一种情况下,当 IOrderRepository 生成响应时,spring 似乎没有考虑转换的需要。
  • 在我的project 中,将注释@JsonFormat 用于字段并添加jackson-datatype-jsr310 作为依赖项就足够了。见我的answer...

标签: java json jackson spring-data-rest spring-hateoas


【解决方案1】:

最后,我发现了问题所在:很简单,一个脏浏览器缓存问题;出于某种原因,在更改不同的设置时,我总是得到相同的结果,而且 HATEOAS 似乎存在问题;清理浏览器缓存解决了这个问题。

按照@Cepr0的建议,也发现只用@JsonFormat注解就够了;所以不需要@JsonSerialize(using = LocalDateTimeSerializer.class) 和@JsonDeserialize(using = LocalDateTimeDeserializer.class) 注释。

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2019-04-21
    • 1970-01-01
    • 2021-02-11
    • 2018-12-09
    • 1970-01-01
    • 2021-11-26
    • 2016-04-20
    • 2019-02-16
    相关资源
    最近更新 更多