springMVC的异常处理

出处:

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 微笑

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值