如何处理的RESTful Spring MVC中删除(How to handle RESTful d

2019-06-23 23:40发布

如何正确使用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";
}

Answer 1:

如果您有删除的问题可以由用户是固定的,那么这似乎确定。 如果有什么用户可以做的那么也许一个错误代码状态会更正确。 唯一的失败我能想到的缺失将是一个授权失败,这将是一个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";
}


Answer 2:

你应该考虑使用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已经提供了一些状态码默认 。



文章来源: How to handle RESTful delete in Spring MVC