Spring Boot中的LocalDateTime序列化HATEOAS休息服务

时间:2017-05-26 07:16:39

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

我面临以下问题:在使用Spring Boot,spring-data-jpa和spring-data-rest的项目中,发布HATEOAS休息服务,我想将LocalDateTime变量转换为& #34; 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
}

这是我的Repository界面:

@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; 
    }
}

现在很奇怪:

  • 如果我向网址&#34; http://localhost:8080/dblocaldatetime&#34;发送请求,那么我的测试控制器将以id = 1的顺序检索订单,并显示正确的日期时间格式(即&#34; 2014-12-20T02:30:00.472&#34);值得注意的是,在这种情况下,资源将在&#34;非HATEOAS&#34;形式,即它没有任何&#34; _link&#34;或者&#34; _embedded&#34;装饰
  • 查询其余的URI&#34; http://localhost:8080/orders/1&#34;我收到了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 个答案:

答案 0 :(得分:1)

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

按照@ Cepr0的建议,还发现仅使用@JsonFormat注释就足够了;因此不需要@JsonSerialize(using = LocalDateTimeSerializer.class)和@JsonDeserialize(using = LocalDateTimeDeserializer.class)注释。

相关问题