springboot如何实现统一异常处理,springboot 异常统一处理

  springboot如何实现统一异常处理,springboot 异常统一处理

  00-1010全局异常处理配置全局异常处理升级添加自定义异常处理控制器数据绑定,数据验证异常GlobalExceptionHandler所有代码汇总项目开发中出现异常是一件很常见的事情。我们也有很多方法来处理异常,可能如下:

  public int div(int a,int b){ int c=0;试试{ c=a/b;} catch(Exception ex){ ex . printstacktrace();}返回c;}如果我们这样处理异常,代码中会出现大量的异常处理模块,会让代码非常不可读,业务模块逻辑会夹杂大量的非业务逻辑。但在项目开发过程中,要以业务模块为主,除了必要的异常处理模块,最好不要包含其他无关的代码。那么我们如何处理项目中无处不在的异常呢?这导致了我们想要引入的全局异常处理方法。主要有两种方式:

  HandlerExceptionResolver .

  @ controller advice @ Exception Handler今天主要介绍@ controller advice @ Exception Handler模式处理全局异常。

  00-1010首先介绍一下@ControllerAdvice和@ExceptionHandler。

  @ControllerAdvice注解:是一个特殊的@组件,用于定义全局异常处理类作用于@Controller类型的所有接口。

  @ExceptionHandler注解:用于声明处理异常的方法。

  00-1010 @ Controller advice @ exception handler只要设计得当,就再也不用在控制器中使用trg-catch了!让我们首先在控制器层引入一个全局异常处理类。

  @ControllerAdvicepublic类global Exception handler { @ response body @ Exception handler(Exception . class)public common result Exception handler(http servlet request,Exception exception)抛出异常{ MapString,Object result=new HashMap(3);string message=exception . getmessage()request . getrequesturl()。toString();返回CommonResult.failed(消息);}}注:@ResponseBody实际上是用来把java对象转换成json格式的数据。那么这里就完成了一个简单的全局异常处理方案,这只是一个简单的异常处理方法,远没有达到一个完整项目中的全局异常处理方案。

  00-1010对于我们项目中的业务处理,通过自定义异常可以知道哪个模块出现了异常,不同的业务模块有不同的异常处理方法,方便我们扩展。

  公共类ServiceException扩展runtime exception { private IErrorCode error code;public service exception(IErrorCode error code){ super(error code . getmessage());this . error code=error code;} public ServiceException(字符串消息){ super(消息);} public service exception(Throwable cause){ super(cause);} public ServiceException(字符串消息,Throwable原因){ super(消息,原因);} public IErrorCode get error code(){

   return errorCode; }}

 

  

加入自定义异常处理

@ControllerAdvicepublic class GlobalExceptionHandler { /** * 处理所有Service层异常 */ @ResponseBody @ExceptionHandler(value = ServiceException.class) public CommonResult handle(ServiceException e) { if (e.getErrorCode() != null) { return CommonResult.failed(e.getErrorCode()); } return CommonResult.failed(e.getMessage()); } /** * 处理所有不可知的异常 */ @ResponseBody @ExceptionHandler(Exception.class) public CommonResult exceptionHandler(HttpServletRequest request, Exception exception) throws Exception { Map<String, Object> result = new HashMap<>(3); String message =exception.getMessage()+request.getRequestURL().toString(); return CommonResult.failed(message); } }

 

  

处理 Controller 数据绑定、数据校验的异常

在用户登录Model字段上注解数据校验规则。

 

  

@Data@EqualsAndHashCode(callSuper = false)public class UserLoginParam { @NotEmpty private String username; @NotEmpty private String password;}

SpringBoot中可以使用@Validated + @RequestBody注解方式实现数据绑定和数据校验。例如登录方式为:

 

  

@ApiOperation(value = "登录以后返回token") @RequestMapping(value = "/login", method = RequestMethod.POST) @ResponseBody public CommonResult login(@Validated @RequestBody UmsAdminLoginParam umsAdminLoginParam) { String token = adminService.login(umsAdminLoginParam.getUsername(), umsAdminLoginParam.getPassword()); if (token == null) { return CommonResult.validateFailed("用户名或密码错误"); } Map<String, String> tokenMap = new HashMap<>(); tokenMap.put("token", token); tokenMap.put("tokenHead", tokenHead); return CommonResult.success(tokenMap); }

如果数据校验不对数据抛出的异常为MethodArgumentNotValidException,所以我们可以在全局异常处理类中添加对MethodArgumentNotValidException异常的处理声明,就可以实现全局处理数据校验和绑定的异常了,实现如下:

 

  

@ResponseBody @ExceptionHandler(value = MethodArgumentNotValidException.class) public CommonResult handleValidException(MethodArgumentNotValidException e) { BindingResult bindingResult = e.getBindingResult(); String message = null; if (bindingResult.hasErrors()) { FieldError fieldError = bindingResult.getFieldError(); if (fieldError != null) { message = fieldError.getField()+fieldError.getDefaultMessage(); } } return CommonResult.validateFailed(message); }

通过上面介绍的未知异常、数据校验和自定义全局异常所有的Controller层的异常处理方式全部都集中到了GlobalExceptionHandler类中,那么我们在Controller类中就不再需要收到记录错误了。

 

  

 

  

GlobalExceptionHandler全部代码

@ControllerAdvicepublic class GlobalExceptionHandler { @ResponseBody @ExceptionHandler(value = ApiException.class) public CommonResult handle(ApiException e) { if (e.getErrorCode() != null) { return CommonResult.failed(e.getErrorCode()); } return CommonResult.failed(e.getMessage()); } @ResponseBody @ExceptionHandler(Exception.class) public CommonResult exceptionHandler(HttpServletRequest request, Exception exception) throws Exception { Map<String, Object> result = new HashMap<>(3); String message =exception.getMessage()+request.getRequestURL().toString(); return CommonResult.failed(message); // return result; } @ResponseBody @ExceptionHandler(value = MethodArgumentNotValidException.class) public CommonResult handleValidException(MethodArgumentNotValidException e) { BindingResult bindingResult = e.getBindingResult(); String message = null; if (bindingResult.hasErrors()) { FieldError fieldError = bindingResult.getFieldError(); if (fieldError != null) { message = fieldError.getField()+fieldError.getDefaultMessage(); } } return CommonResult.validateFailed(message); }}

 

  

总结

今天主要讲解了@ControllerAdvice+@ExceptionHandler进行统一的在Controller层上的全局异常处理。

 

  到此这篇关于SpringBoot实现全局异常处理方法总结的文章就介绍到这了,更多相关SpringBoot全局异常处理内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: