SpringBoot自定义错误处理逻辑详解_第1页
SpringBoot自定义错误处理逻辑详解_第2页
SpringBoot自定义错误处理逻辑详解_第3页
SpringBoot自定义错误处理逻辑详解_第4页
SpringBoot自定义错误处理逻辑详解_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第SpringBoot自定义错误处理逻辑详解目录1.自定义错误页面2.@ControllerAdvice+@ExceptionHandler3.使用@ResponseStatus处理自定义异常4.框架底层异常5.自定义异常解析器6.ErrorViewResolver实现自定义处理异常

1.自定义错误页面

将自定义错误页面放在templates的error文件夹下,SpringBoot精确匹配错误信息,使用4xx.html或者5xx.html页面可以打印错误信息

4xx打印status及message信息

h2th:text="${status}"pagenotfound/h2

h3th:text="${#message}"WeCouldn'tFindThisPage/h3

5xx打印message及trace信息

h3th:text="${message}"Somethingwentwrong./h3

pth:text="${trace}"WhynottryrefreshingyoupageOryoucanahref="#"rel="externalnofollow"contactoursupport/aiftheproblempersists./p

2.@ControllerAdvice+@ExceptionHandler

自定义全局异常处理类,处理ArithmeticException及NullPointerException异常

packagecom.wanqing.admin.exception;

importlombok.extern.slf4j.Slf4j;

importorg.springframework.web.bind.annotation.ControllerAdvice;

importorg.springframework.web.bind.annotation.ExceptionHandler;

@Slf4j

@ControllerAdvice//使用此注释

publicclassGlobalExceptionHandler{

@ExceptionHandler({ArithmeticException.class,NullPointerException.class

})//使用此注释,大括号内为可以处理的异常信息

publicStringhandleArithException(Exceptione){

("异常是:"+e);

return"login";//返回一个视图地址(ModelAndView)

}

原理:

使用ExceptionHandlerExceptionResolver异常处理器处理用@ExceptionHandler注释的异常

3.使用@ResponseStatus处理自定义异常

自定义异常类示例代码:

importorg.springframework.http.HttpStatus;

importorg.springframework.web.bind.annotation.ResponseStatus;

@ResponseStatus(value=HttpStatus.FORBIDDEN,reason="用户数量太多~~")//异常可以返回状态码信息

publicclassuserToManyextendsRuntimeException{

//有参构造器

publicuserToMany(Stringmessage){

super(message);

publicuserToMany(){

}

原理:

ResponseStatusExceptionResolver处理器可以处理@ResponseStatus注解的异常,得到@ResponseStatus注解的信息,调用response.sendError(statusCode)方法将错误信息返回,并发送/error请求,交由底层处理

sendError表示此次请求立刻结束,发出/error请求,SpringBoot找谁能处理,都不能处理返回默认的错误页

protectedModelAndViewapplyStatusAndReason(intstatusCode,@NullableStringreason,HttpServletResponseresponse)throwsIOException{

if(!StringUtils.hasLength(reason)){

response.sendError(statusCode);

}else{

StringresolvedReason=this.messageSource!=nullthis.messageSource.getMessage(reason,(Object[])null,reason,LocaleContextHolder.getLocale()):reason;

response.sendError(statusCode,resolvedReason);

returnnewModelAndView();

}

4.框架底层异常

使用DefaultHandlerExceptionResolver异常处理器能处理SpringMVC底层异常,其能处理我异常种类如下

protectedModelAndViewdoResolveException(HttpServletRequestrequest,HttpServletResponseresponse,@NullableObjecthandler,Exceptionex){

try{

if(exinstanceofHttpRequestMethodNotSupportedException){

returnthis.handleHttpRequestMethodNotSupported((HttpRequestMethodNotSupportedException)ex,request,response,handler);

//此处省略

if(exinstanceofHttpMessageNotWritableException){

returnthis.handleHttpMessageNotWritable((HttpMessageNotWritableException)ex,request,response,handler);

if(exinstanceofMethodArgumentNotValidException){

returnthis.handleMethodArgumentNotValidException((MethodArgumentNotValidException)ex,request,response,handler);

}catch(Exceptionvar6){

if(this.logger.isWarnEnabled()){

this.logger.warn("Failurewhiletryingtoresolveexception["+ex.getClass().getName()+"]",var6);

returnnull;

}

5.自定义异常解析器

自定义异常解析器需要满足以下:

实现HandlerExceptionResolver接口并注册到容器中(@Component)在自定义解析器中实现resolveException方法,方法内可通过sendError方法返回错误信息并返回一空视图,交给底层将错误信息解析拼接为最终页面可以通过@Order注释调整自定义异常解析器的优先级,value越小优先级越高

自定义异常解析器示例代码:

importjavax.servlet.http.HttpServletResponse;

importjava.io.IOException;

@Order(value=Ordered.HIGHEST_PRECEDENCE)//优先级数字越小,优先级越高

@Component//注册到容器中

publicclassCustomerHandlerResolverimplementsHandlerExceptionResolver{

@Override

publicModelAndViewresolveException(HttpServletRequesthttpServletRequest,HttpServletResponsehttpServletResponse,Objecto,Exceptione){

try{

httpServletResponse.sendError(511,"我不喜欢的错误");

}catch(IOExceptione1){

e1.printStackTrace();

returnnewModelAndView();

}

自定义异常处理器被加入(未调整优先级时,默认加到最后):

6.ErrorViewResolver实现自定义处理异常

交由ErrorViewResolver的情况:

情况一:response.se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论