Xor*_*rty 9 java rest spring spring-mvc
如何在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";
}
Run Code Online (Sandbox Code Playgroud)
mat*_*sev 19
您应该考虑使用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)
另外,Spring 默认HandlerExceptionResolver
提供了一些状态代码.
Kod*_*odi 11
如果您可以通过用户修复删除问题,那么这似乎没问题.如果用户无法做任何事情,那么错误代码状态可能更正确.我可以想象删除的唯一失败是授权失败,这将是一个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";
}
Run Code Online (Sandbox Code Playgroud)
您可以根据需要替换其他状态代码,但这是一般概念.
你也可以这样做:
if (!wasOk) {
throw new DataAccessException("Unable to delete item: " + item);
}
Run Code Online (Sandbox Code Playgroud)
然后在同一个类中有一个带注释的错误处理程序
@ExceptionHandler(DataAccessException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
public String handleDataAccessException(DataAccessException ex) {
// Do some stuff
return "errorView";
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
47406 次 |
最近记录: |