我想知道如何正确实现一个应该作为REST服务的Spring控制器。特别是我想尝试尽可能使RESTful接口。此外,我想利用HTTP错误代码,以便我的客户可以采取相应的行动。错误处理的Spring MVC Rest服务控制器是否正确?
我想知道如何实现我的方法,所以他们返回JSON如果一切正常(在响应的主体)或折腾一个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;
}
}
我知道代码是不是“刚刚好”,但我无法弄清楚如何让它成为它需要的方式。也许一些经验反应会有所帮助? Thx的支持已经
我喜欢这个主意,我其实只是这么做的!我按照Bart的建议创建了一个错误资源,然后在这个方法中处理ctrl中的所有错误。我可能会进一步推广和处理广泛的错误应用,但一次只能一步。 – pascalwhoop 2013-04-30 10:31:20
您可以在您的Controller中为每个异常类型创建多个ExceptionHandlers。 – 2013-04-30 11:03:17
我发现它看起来更清洁,如果我只是每个控制器有一个exceptionhandler方法而不是整个数组,然后照顾检查这个处理程序中引发的错误 – pascalwhoop 2013-04-30 12:33:31