带有错误处理的Spring MVC Rest Service Controller完成了吗?


问题内容

我想知道如何正确实现应该用作REST服务的Spring
Controller。特别是我想尝试使该接口尽可能地RESTful。我也想利用HTTP错误代码,以便我的客户可以采取相应的行动。

我想知道如何实现我的方法,因此如果一切正常(在响应正文中)或抛出http错误代码以及不起作用的自定义原因(可能是DAO或数据库)。但是我不确定哪种方法正确?返回一个字符串并添加值以返回到模型,还是返回一个HashMap并将我的东西放在那里?或直接返回对象?但是如果发生错误并且我无法返回所说的班怎么办?返回null代替?我发布了2-3种可以想象的方式:

@RequestMapping(value="/addUser", method= RequestMethod.POST)
public String addUser(@RequestBody User user, HttpServletResponse response, Model model) throws Exception{

    try{
        userService.addUser(user);
        model.addAttribute("user", userService.getUser(user.getUsername(), user.getPassword()));
        return "user";
    }catch(Exception e){
        model.addAttribute("error", e.toString());
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
        return "error";
    }
}

或者更像这样:

@RequestMapping(value="/addUser", method= RequestMethod.POST)
public @ResponseBody Map addUser(@RequestBody User user, HttpServletResponse response){
    Map map = new HashMap();
    try{
        userService.addUser(user);
        map.put("success", true);
        map.put("username", user.getUsername());
    }catch (KeyAlreadyExistsException e){
        map.put("success", false);
        map.put("Error", e.toString());
        response.sendError(HttpServletResponse.SC_FORBIDDEN, e.toString());
    }catch(Exception e){
        map.put("success", false);
        map.put("Error", e.toString());
        response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.toString());
    }
    finally {
        return map;
    }
}

我意识到代码不是“正确的”,但是我无法弄清楚如何按照需要的方式进行编码。也许一些经验反应会有所帮助?感谢您的支持


问题答案:

您还可以@ExceptionHandler在Rest Controller中使用带注释的方法捕获异常。

@ExceptionHandler(Exception.class)
@ResponseBody
@ResponseStatus(value = HttpStatus.BAD_REQUEST)
public String handleException(Exception e) {
    return "return error object instead";
}

这将使您的主要控制者/业务逻辑变得更加整洁。