如何在Spring MVC中处理RESTful删除


问题内容

如何在Spring MVC控制器中正确使用RESTful删除?我有尝试删除某些项目时返回布尔值的DAO。

我正在尝试删除项目。如果一切正常,则只显示项目列表(已删除的项目将不再存在)。如果无法删除该项目,请重定向到详细信息页面,并说明为什么无法删除该项目。

我需要一些特殊的响应状态或类似的东西吗?我的方法是RESTful的吗?

@RequestMapping(value = "items/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") int itemId, Model model) {
    Item item = itemDao.get(id);

    // true -> can delete
    // false -> cannot delete, f.e. is FK reference somewhere
    boolean wasOk = itemDao.delete(item);

    if (wasOk) {
        return "redirect:/items";
    }

    // will write to user which item couldn't be deleted
    model.addAttribute("item", item);
    return "items/error";
}

问题答案:

如果您可以解决用户的删除问题,那么似乎可以。如果用户无能为力,那么错误代码状态可能会更正确。我可以想象的唯一的删除失败是授权失败,它是401。可以通过向您的方法“
HttpServletResponse response”添加参数来设置此失败。您的代码将变为:

@RequestMapping(value = "items/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") int itemId, Model model, HttpServletReponse response) {
    Item item = itemDao.get(id);

    // true -> can delete
    // false -> cannot delete, f.e. is FK reference somewhere
    boolean wasOk = itemDao.delete(item);

    if (!wasOk) {
        // will write to user which item couldn't be deleted
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        model.addAttribute("item", item);
        return "items/error";   
    }

    return "redirect:/items";
}

您可以适当地替换其他状态代码,但这是一般性的想法。

您还可以执行以下操作:

    if (!wasOk) {
        throw new DataAccessException("Unable to delete item: " + item);
    }

然后在同一个类中有一个带注释的错误处理程序

@ExceptionHandler(DataAccessException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleDataAccessException(DataAccessException ex) {
    // Do some stuff
    return "errorView";
}