RESTful GET和版本控制

时间:2014-09-18 04:09:11

标签: rest http httpresponse

我遇到了鸡蛋和鸡蛋问题"用我的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都会递增它。

1 个答案:

答案 0 :(得分:1)

如果从数据库中删除实体,则应立即重新serverVersion {{1}}。如果实体发生任何更改,则客户端中的缓存版本需要失效,并将删除计数作为更改。如果这是您遇到的问题,或许您需要在DAO中添加支持以在删除实体时更新服务器上的ETag哈希值。