如何正确使用REST风格的删除Spring MVC的控制器? 我有DAO试图删除某些项目时,返回boolean值。
我想删除的项目。 如果一切正常,只是显示的项目(已删除项目不会存在了)的列表。 如果项目不能被删除,重定向到详细信息页面,并说明为什么无法删除。
我需要一些特殊的响应状态或类似这样的东西吗? 是我的方法REST风格的?
@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的响应”进行设置。 您的代码将成为类似:
@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";
}
您可以substitue其他状态码合适,但那是一般的想法。
你也可以这样做:
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";
}
你应该考虑使用HTTP状态代码指示删除操作是否成功,不而不是重定向。 例如HTTP 200 OK
(或HTTP 204 No Content
),表明操作成功,和HTTP 404 Not Found
,如果你要访问的资源不存在, HTTP 405 Method Not Allowed
如果不允许删除操作,等。基于响应状态,客户可以决定是否要保存引用的资源(在你的案件由引用的对象item/{id}
由于您使用Spring,你可以注释你的控制器方法用适当的@ResponseStatus ,如@ResponseStatus(value = HttpStatus.NO_CONTENT)
此外,春天HandlerExceptionResolver
已经提供了一些状态码默认 。