java异常统一处理_SpringMVC异常统一处理的三种方式

更新时间:2023-06-14 16:55:42 阅读: 评论:0

java异常统⼀处理_SpringMVC异常统⼀处理的三种⽅式Spring 统⼀异常处理有 3 种⽅式,分别为:
使⽤@ ExceptionHandler注解、实现HandlerExceptionResolver接⼝、使⽤ @controlleradvice 注解
使⽤ @ ExceptionHandler 注解
使⽤该注解有⼀个不好的地⽅就是:进⾏异常处理的⽅法必须与出错的⽅法在同⼀个Controller⾥⾯。使⽤如下:@Controller
public class GlobalController {
/**
* ⽤于处理异常的
* @return
*/
@ExceptionHandler({MyException.class})
public String exception(MyException e) {
System.out.Message());
e.printStackTrace();
return "exception";
}
@RequestMapping("test")
public void test() {
赋得
throw new MyException("出错了!");
}
}
可以看到,这种⽅式最⼤的缺陷就是不能全局控制异常。每个类都要写⼀遍。
实现 HandlerExceptionResolver 接⼝
这种⽅式可以进⾏全局的异常控制。例如:@Component
public class ExceptionTest implements HandlerExceptionResolver{
/**
* TODO 简单描述该⽅法的实现功能(可选).
* @e org.springframework.web.rvlet.HandlerExceptionResolver#resolveException(javax.rvlet.http.HttpServletRequest, javax.rvlet.http.HttpServletRespon, java.lang.Object, java.lang.Exception)
*/
public ModelAndView resolveException(HttpServletRequest request, HttpServletRespon respon, Object handler,
Exception ex) {
System.out.println("This is exception handler method!");
return null;
}
}
使⽤ @ControllerAdvice+ @ ExceptionHandler 注解
上⽂说到 @ ExceptionHandler 需要进⾏异常处理的⽅法必须与出错的⽅法在同⼀个Controller⾥⾯。那么当代码加⼊了
@ControllerAdvice,则不需要必须在同⼀个 controller 中了。这也是 Spring 3.2 带来的新特性。从名
字上可以看出⼤体意思是控制器增强。 也就是说,@controlleradvice + @ ExceptionHandler 也可以实现全局的异常捕捉。
请确保此WebExceptionHandle 类能被扫描到并装载进 Spring 容器中。@ControllerAdvice
@ResponBody
public class WebExceptionHandle {
private static Logger logger = Logger(WebExceptionHandle.class);
/**
* 400 - Bad Request
*/
@ResponStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(HttpMessageNotReadableException.class)
public ServiceRespon handleHttpMessageNotReadableException(HttpMessageNotReadableException e) {
<("参数解析失败", e);
return ServiceResponHandle.failed("could_not_read_json");
}
/**
* 405 - Method Not Allowed
*/
@ResponStatus(HttpStatus.METHOD_NOT_ALLOWED)
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public ServiceRespon handleHttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException e) {
<("不⽀持当前请求⽅法", e);鹰嘴豆怎么吃
return ServiceResponHandle.failed("request_method_not_supported");
}
/**
* 415 - Unsupported Media Type风景作文500字
*/
@ResponStatus(HttpStatus.UNSUPPORTED_MEDIA_TYPE)
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
public ServiceRespon handleHttpMediaTypeNotSupportedException(Exception e) {
<("不⽀持当前媒体类型", e);
return ServiceResponHandle.failed("content_type_not_supported");
}
/**
* 500 - Internal Server Error
*/
@ResponStatus(HttpStatus.INTERNAL_SERVER_ERROR)
@ExceptionHandler(Exception.class)
public ServiceRespon handleException(Exception e) {
if (e instanceof BusinessException){
return ServiceResponHandle.failed("BUSINESS_ERROR", e.getMessage());
}
<("服务运⾏异常", e);
e.printStackTrace();
return ServiceResponHandle.failed("rver_error");
}
}
如果 @ExceptionHandler 注解中未声明要处理的异常类型,则默认为参数列表中的异常类型。所以还可以写成这样:@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler()
@ResponBody
String handleException(Exception e){
return "Exception Deal! " + e.getMessage();
}
}
参数对象就是 Controller 层抛出的异常对象!
继承 ResponEntityExceptionHandler 类来实现针对 Rest 接⼝ 的全局异常捕获,并且可以返回⾃定义格式:@Slf4j新生儿奶量标准
@ControllerAdvice
方少华public class ExceptionHandlerBean extends ResponEntityExceptionHandler {
/**
* 数据找不到异常
* @param ex
* @param request
彩霞电影院* @return
* @throws IOException
飘飘欲仙灰太狼
*/
@ExceptionHandler({DataNotFoundException.class})
public ResponEntity handleDataNotFoundException(RuntimeException ex, WebRequest request) throws IOException {
return getResponEntity(ex,request,ReturnStatusCode.DataNotFoundException);
}
/**
* 根据各种异常构建 ResponEntity 实体. 服务于以上各种异常
* @param ex
冬瓜豆腐
* @param request
* @param specificException
* @return
*/
private ResponEntity getResponEntity(RuntimeException ex, WebRequest request, ReturnStatusCode specificException) {
ReturnTemplate returnTemplate = new ReturnTemplate();
returnTemplate.tStatusCode(specificException);
returnTemplate.Message());
return handleExceptionInternal(ex, returnTemplate,
new HttpHeaders(), HttpStatus.OK, request);
}
}

本文发布于:2023-06-14 16:55:42,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1038351.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:全局   实现   参数   控制
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图