Spring mvc 异常处理 例子
By:Roy.LiuLast updated:2013-10-08
异常处理,在程序开发过程中,是个很重要的部分,能处理的异常我们自己处理,否则抛出来,如果用spring mvc 最终是抛到 controller 层。所以 spring mvc 的异常处理统一在controller 处理。在 spring 3.0 以上,提供了 @ExceptionHandler 这个class 去处理异常. 下面记录 spring mvc 异常处理常用方法.
1. 定义自己的业务异常处理类,比如
2. 在 Controller 层中 利用 @ExceptionHandler 加入相应的业务异常 各自 怎么处理的逻辑. 例子如下:
3. 定义错误处理页面, 显示出错的信息,这里就不怎么写出代码了,应该很简单的。
但是用上面的方法做出来的,只是针对一个 Controller 做出的异常处理, 但事实上在程序开发过程中,有很多个Controller , 有什么办法, 让这些异常处理的方法适用于所有 Controller 呢, 至少有两种方法。
方法一,将这些处理异常的方法 放到一个 BaseController 中,其他 Controller 从这个BaseController 中继承过来就可以了。
方法二,利用 Spring 提供的 @ControllerAdvice 实现,如下所示:
这样就能对所有的 Controller 应用这些异常处理了.
1. 定义自己的业务异常处理类,比如
public class CustomGenericException extends RuntimeException { private static final long serialVersionUID = 1L; private String errCode; private String errMsg; public String getErrCode() { return errCode; } public void setErrCode(String errCode) { this.errCode = errCode; } public String getErrMsg() { return errMsg; } public void setErrMsg(String errMsg) { this.errMsg = errMsg; } public CustomGenericException(String errCode, String errMsg) { this.errCode = errCode; this.errMsg = errMsg; } }
2. 在 Controller 层中 利用 @ExceptionHandler 加入相应的业务异常 各自 怎么处理的逻辑. 例子如下:
import java.io.IOException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import com.mkyong.web.exception.CustomGenericException; @Controller public class MainController { @RequestMapping(value = "/{type:.+}", method = RequestMethod.GET) public ModelAndView getPages(@PathVariable("type") String type) throws Exception { if ("error".equals(type)) { // go handleCustomException throw new CustomGenericException("E888", "This is custom message"); } else if ("io-error".equals(type)) { // go handleAllException throw new IOException(); } else { return new ModelAndView("index").addObject("msg", type); } } // 这里处理自定义的业务异常,当有 CustomGenericException 抛出时会执行. @ExceptionHandler(CustomGenericException.class) public ModelAndView handleCustomException(CustomGenericException ex) { ModelAndView model = new ModelAndView("error/generic_error"); model.addObject("errCode", ex.getErrCode()); model.addObject("errMsg", ex.getErrMsg()); return model; } // 处理所有异常,自定义异常之外的异常都执行到这里. @ExceptionHandler(Exception.class) public ModelAndView handleAllException(Exception ex) { ModelAndView model = new ModelAndView("error/generic_error"); model.addObject("errMsg", "this is Exception.class"); return model; } }
3. 定义错误处理页面, 显示出错的信息,这里就不怎么写出代码了,应该很简单的。
但是用上面的方法做出来的,只是针对一个 Controller 做出的异常处理, 但事实上在程序开发过程中,有很多个Controller , 有什么办法, 让这些异常处理的方法适用于所有 Controller 呢, 至少有两种方法。
方法一,将这些处理异常的方法 放到一个 BaseController 中,其他 Controller 从这个BaseController 中继承过来就可以了。
方法二,利用 Spring 提供的 @ControllerAdvice 实现,如下所示:
import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.servlet.ModelAndView; import com.mkyong.web.exception.CustomGenericException; @ControllerAdvice public class GlobalExceptionController { @ExceptionHandler(CustomGenericException.class) public ModelAndView handleCustomException(CustomGenericException ex) { ModelAndView model = new ModelAndView("error/generic_error"); model.addObject("errCode", ex.getErrCode()); model.addObject("errMsg", ex.getErrMsg()); return model; } @ExceptionHandler(Exception.class) public ModelAndView handleAllException(Exception ex) { ModelAndView model = new ModelAndView("error/generic_error"); model.addObject("errMsg", "this is Exception.class"); return model; } }
这样就能对所有的 Controller 应用这些异常处理了.
From:一号门
Previous:简单方法合并两个java list
COMMENTS