我遇到了鸡蛋和鸡蛋问题"用我的GET方法。 关键是我使用ETag进行版本控制,如下所示:
@RequestMapping(value = "/item/{itemId}", method = RequestMethod.GET)
public ResponseEntity<Item> get(
@PathVariable itemId,
@Version Integer version) {
return DAO.get(itemId, version)
}
@Version 封装检索ETag,但这并不重要。
public Item DAO.get(int id, Integer version) {
if (version == serverVersion)
//then response with 304 Not Modified
else{
if (entity.findById(id) == null)
//then return 404 Not Found
else {
// return item and 200 OK
}
}
}
正如您所看到的,如果项目在数据库中不存在但是传递了正确的版本 - 客户端会收到 304 而不是 404 。
但如果我之前进行数据库检查 - 尽管版本相同,也会执行事务处理。
解决此问题的最佳方法是什么?
编辑1: 服务器版本是全局的。 它用于同步。
服务器上每个实体上的每个PUT / POST / DELETE都会递增它。
答案 0 :(得分:1)
如果从数据库中删除实体,则应立即重新serverVersion
{{1}}。如果实体发生任何更改,则客户端中的缓存版本需要失效,并将删除计数作为更改。如果这是您遇到的问题,或许您需要在DAO中添加支持以在删除实体时更新服务器上的ETag哈希值。