如何在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";
}