出处:
http://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc#user-content-sample-application
感谢原文作者的不辞辛苦
这个文章介绍了几种处理处理异常的方式
1. 真对exception
2. 针对controller
3. 全局
一 针对异常使用HTTP状态码
对于我们的自定义异常,可以通过@ResponseStatus注解来实现HTTP状态码的返回
例如:下面是一个没有订单的异常
@ResponseStatus(Value=HTTPStatus.NOT_FOUND,reason=”Nosuch Order”)//404
public class OrderNotFoundException extendsRuntimeExcetpion{
//…
}
下面是使用该异常的controller
@RequestMapping(value=”/orders/{id}”,method=GET)
public String showOrder(@PathVariable(“id”)long id,Model model){
Orderorder=orderRepository.findOrderById(id);
if(order==null)
thrownew OrderNotFoundException(id);
moder.addAttribute(order);
retrurn“orderDetail”;
}
二 基于controller的异常处理
使用 @ExceptionHandler
在controller中增加由@ExceptionHandler注解的方法,来处理异常
@Controller
public class ExceptonHandlingContreller{
//controller的其他方法
//。。。
//第一种形式:将异常转换为http状态码
@ResponseStatus(value=HttpStatus.CONFLICT,reason=”dataintegrity violation”)
@ExceptionHandler(DataIntegrityViolationExcetpion.class)
public void conflict(){
//method
}
//第二种形式,指定显示异常的视图名
@ExceptionHandler({SQLExcetpion.class,DataAccessException.class})
public String databaseError(){
return“databaseError”;
}
//第三种形式,返回带视图名的model
@ExceptionHandler({Exception.class})
public ModelAndView handleError(HttpServletRequestreq,Exception exception){
logger.error(“Request:”+req.getRequestURL()+”raosed”+exception);
ModelAndViewmav=new ModelAndView();
// mav.addObject();
// …
mav.setViewName(“error”);
returnmav;
}
三 全局异常处理
使用@ControllerAdvice 和@EnableWebMvc注解
适用于全局
@EnableWebMvc
@ControllerAdvice
class GlobalControllerExcetpionHandler{
@ResponseStatus(Http.CONFLICT)
@ExceptionHandler(AException.class)
public voidhandle(){
//method
}
}
增加一个全局的默认异常处理器,是一个不错的想法
@EnableWebMvc
@Controller
class GlobalDefaultExceptionHandler{
@ExceptionHandler(Exception.class)
publicModelAndView defaultErrorHandler(HttpServletRequest req,Exception e) throwsException {
//如果Exception被返回状态码注解,那么就继续抛出
//AnnotationUtils是spring的一个工具类
if(AnnotationUtils.findAnnotation(e.getClass(),ResponseStatus.class!=null))
throwe;
//否则返回默认错误页面
ModelAndViewmav=new ModerAndView();
mav.addObject(“excetption”,e);
mav.addObject(“url”,req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
returnmav
}
}
have fun