我想知道如何正确实现应该用作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
@ExceptionHandler(Exception.class) @ResponseBody @ResponseStatus(value = HttpStatus.BAD_REQUEST) public String handleException(Exception e) { return "return error object instead"; }
这将使您的主要控制者/业务逻辑变得更加整洁。