Spring Boot HATEOAS rest服务中的java LocalDateTime序列化
我面临以下问题:在一个使用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”形式返回的,即它没有任何“_链接”或“_嵌入”装饰
- 查询rest 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(使用=LocalDateTimeSerializer.class)和@jsondesellize(使用=LocalDateTimeDeserializer.class)注释