1

如果 Spring 控制器调用的代码抛出 Spring DataAccessException,并且控制器没有捕获它或没有为其提供异常处理程序,那么 Spring 是否会向客户端返回适当的 HTTP 响应状态?

也就是说,DataAccessExceptions 有没有合适的@ResponseStatus注解?或者 Spring MVC 框架是否显式地捕获这些异常并处理它们?或者框架对他们没有做任何特别的事情,然后像对待任何其他人一样对待RuntimeException,我猜这会导致 HTTP 状态为 500(内部服务器错误)。

4

1 回答 1

1

如果 Spring 没有处理程序,它看起来DispatcherServlet.doService(以及它委托给的后续方法)只是将异常委托给 servlet 容器。默认情况下,Spring 具有使用@ExceptionHandler@ResponseStatus注释的处理程序,以及看起来很有前途的DefaultHandlerExceptionResolver. 但后者对 s 没有任何作用DataAccessException。所以,Spring MVC 对 s 没有什么特别DataAccessException的。

如果您想将DataAccessExceptions 映射到特定的 HTTP 响应状态代码,可以使用@ExceptionHandler方法

它看起来像这样:

@Controller
public class YourController {

  @RequestMapping(value = "foo")
  public void foo() throws DataAccessException {
    ...
  }

  @ExceptionHandler(DataAccessException.class)
  @ResponseStatus(value=HttpStatus.INTERNAL_SERVER_ERROR)
  @ResponseBody
  public String handleException(DataAccessException ex) {
    return "error message";
  }
}
于 2013-06-29T16:06:52.777 回答