本节介绍SpringMVC的异常处理机制
首先介绍SpringMVC默认提供了一些HTTP错误类似码的默认异常处理
如何给一个Controller自定义异常处理
如何为项目做一个全局异常处理
提到异常处理,就不得不提HandlerExceptionResolvers,我们的DispatcherServlet默认设置三个异常处理器:
AnnotationMethodHandlerExceptionResolver
:通过注解@ExceptionHandler实现异常理出ResponseStatusExceptionResolver
:通过注解@ResponseStatus处理HTTP请求的状态码异常DefaultHandlerExceptionResolver
:处理Spring Exception并将其转换为HTTP响应状态码传送的客户端
SpringMVC默认处理的几种异常
Exception | HTTP Status Code |
---|---|
BindException |
400 (Bad Request) |
ConversionNotSupportedException |
500 (Internal Server Error) |
HttpMediaTypeNotAcceptableException |
406 (Not Acceptable) |
HttpMediaTypeNotSupportedException |
415 (Unsupported Media Type) |
HttpMessageNotReadableException |
400 (Bad Request) |
HttpMessageNotWritableException |
500 (Internal Server Error) |
HttpRequestMethodNotSupportedException |
405 (Method Not Allowed) |
MethodArgumentNotValidException |
400 (Bad Request) |
MissingServletRequestParameterException |
400 (Bad Request) |
MissingServletRequestPartException |
400 (Bad Request) |
NoHandlerFoundException |
404 (Not Found) |
NoSuchRequestHandlingMethodException |
404 (Not Found) |
TypeMismatchException |
400 (Bad Request) |
MissingPathVariableException |
500 (Internal Server Error) |
NoHandlerFoundException |
404 (Not Found) |
首先介绍的是注解@ResponseStatus
@ResponseStatus
用于自定义异常类上
该异常属于某种HTTP错误状态码异常(或者说交由其处理)
例如:我们自定义一个异常类:HttpStateCode404Exception,将其映射到404状态码
异常类:HttpStateCode404Exception.java
@ResponseStatus(code=HttpStatus.NOT_FOUND,reason="页面未找到")
public class HttpStateCode404Exception extends RuntimeException{
private static final long serialVersionUID = 1L;
}
然后我们在一个Controller类处理/handleException/存在在的映射路径时的处理方法
@Controller
@RequestMapping("handleException")
public class HandleExceptionController {
@RequestMapping("{url}")
public void handle404(){
throw new HttpStateCode404Exception();
}
}
细心的读者,一定会发现,我在上面注掉的代码使用了@ExceptionHandler注解
最终我们可以得到错误页面提示是这样的:好丑,但是有我们的reason
此方式只能实现简单的信息提示。
再来看看@ExceptionHandler
打开上面被注释掉的代码,你会发现我们的错误控制可以(转发)跳转页面了。
而且由于我们的这个方法定义在这个Controller类中,只要满足此@ExceptionHandler定义的异常都会走这个方法。
注意:是这个Controller类中所有请求出现异常,且异常被其包含
我希望定义一个全局异常处理呢???@ControllerAdvice
为我们实现处理所以的控制器Controllers的异常
具体实现
@ControllerAdvice
public class GlobalExceptionAdvice {
@ExceptionHandler({HttpStateCode404Exception.class})
public String handleThisController(){
return "/handleException/404";
}
}
异常处理的顺序
1.Controller处理时抛出异常
2.本Controller类中的@ExceptionHandler如果捕获到,就执行其处理方法
3.否则,由全局异常捕获处理
4.否则,由@ResponseStatus注解的异常捕获处理
5.最后DefaultHandlerExceptionResolver处理
这恰恰也就是DispatcherServlet异常处理器的配置顺序(循序调用,List)
自定义异常类(SpringMVC的异常处理)
SpringMVC当中的异常处理–自定义异常处理类
①:自定义异常类
public class CustomerException extends Exception {
//定义我们的异常信息
private String exceptMsg;
public CustomerException(String exceptMsg){
this.exceptMsg = exceptMsg;
}
public String getExceptMsg() {
return exceptMsg;
}
public void setExceptMsg(String exceptMsg) {
this.exceptMsg = exceptMsg;
}
}
②:自定义异常处理器
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.jws.WebParam.Mode;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.omg.CORBA.PRIVATE_MEMBER;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
public class CustomerExceptionResolver implements HandlerExceptionResolver {
@Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) {
//通过我们自定义异常处理器,继承自HandlerExceptionResolver 来实现我们的异常处理
//自定义我们的异常信息
String msg = "";
//通过ModelAndView 来实现跳转到我们的错误页面,并且将错误信息带回到页面进行显示
ModelAndView view = new ModelAndView();
view.setViewName("error");
//取出我们自定义的异常信息
if(ex instanceof CustomerException){
CustomerException exception = (CustomerException) ex;
msg = exception.getExceptMsg();
}else{
//获取我们的stringWriter来获取我们的异常信息
StringWriter writer = new StringWriter();
PrintWriter printWriter = new PrintWriter(writer);
//通过ex.printStackTrace(printWriter);来向我们的printWriter当中输入异常信息
ex.printStackTrace(printWriter);
msg = writer.toString();
}
//获取到异常信息之后,通过短信,邮件等技术,通知相关人员
view.addObject("msg", msg);
return view;
}
}
③:配置我们的异常处理器
<!-- 申明我们的异常解析处理类-->
<bean id="customerExceptionResolver" class="cn.itcast.springmvc.exception.CustomerExceptionResolver"></bean>
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。