在Spring Boot HATEOAS REST服务中进行LocalDateTime序列化

3
我面临以下问题:在一个使用Spring Boot、spring-data-jpa和spring-data-rest的项目中,为了发布HATEOAS rest服务,我想将一个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”装饰
  • 查询rest 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而不是LocalDateTime。此外,请不要忘记在您的gradle/maven配置文件中添加jackson-datatype-jsr310依赖项。 - Marc Tarin
谢谢@mark,感谢你的回答。我已经添加了jackson-datatype-jsr310依赖项,所以我能够得到我想要的格式,至少在某些情况下,即当没有HATEOAS响应时。另一种情况是,当响应由IOrderRepository生成时,似乎Spring不考虑转换的需要。 - Spuches
在我的项目中,只需要使用注解@JsonFormat来标记字段,并添加jackson-datatype-jsr310依赖即可。请参考我的回答... - Cepr0
1个回答

2
最后,我发现问题所在:它只是一个浏览器缓存问题;由于某种原因,在更改不同的设置时,我总是得到相同的结果,并且似乎存在HATEOAS问题;清除浏览器缓存解决了问题。
根据@Cepr0的建议,还发现只使用@JsonFormat注释就足够了;因此不需要@JsonSerialize(using = LocalDateTimeSerializer.class) 和@JsonDeserialize(using = LocalDateTimeDeserializer.class)注释。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接