美文网首页
Spring全局统一异常处理@ControllerAdvice+

Spring全局统一异常处理@ControllerAdvice+

作者: wang_cheng | 来源:发表于2020-03-31 18:37 被阅读0次

    使用 @ControllerAdvice + @ExceptionHandler 注解 这两个注解功能可以百度哈,这边只介绍下具体使用

    • 平时使用中为了接口安全不想将一些不必要的异常返回出去,可以进行一些处理统一封装返回
    • 一些程序报错信息不想让用户看到,比如by zero

    这时需要全局异常来帮我们统一处理返回

    比如针对不同业务抛出异常,需要手动处理 try catch

    public Object  test(){
            try {
                //具体业务
                return ResultBean.success();
            }catch (ServiceException e){
                return ResultBean.error(300,"网络开小差了");
            }
            catch (Exception e){
                return ResultBean.error(500,"系统错误");
    
            }
            
        }
    

    比如使用 @RequestParam

    public Object test(@RequestParam Integer id,@RequestParam String name){
            return userService.test(id,name);
        }
    

    这边对入参做了限制,但是如果不做异常处理,会返回这样的


    image.png

    这样向外暴露了缺少id参数,如果是比较重要的接口别人可以知道少了具体的参数名称,可以一直试接口

    针对这个异常统一处理后返回是这样的:

    {
        "code": 300,
        "msg": "请求失败",
        "data": null
    }
    

    不向外暴露具体异常信息,这边列了几个常用的,当然根据业务可以自定义设定处理更多异常

    @RestControllerAdvice
    @Slf4j
    public class ExceptionHandler {
    
    
        /**
         * 针对@RequestParam 抛出的限制异常,统一返回
         * @param e
         * @return
         */
        @org.springframework.web.bind.annotation.ExceptionHandler({MissingServletRequestParameterException.class})
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public ResultBean validationException(MissingServletRequestParameterException e){
            log.error("缺少请求参数:参数名:{}->类型:{}",e.getParameterName(),e.getParameterType());
           //异常信息可以自定义返回
            return ResultBean.error("请求失败");
        }
    
        /**
         * 手动抛出的自定义异常,统一返回
         * @param e
         * @return
         */
        @org.springframework.web.bind.annotation.ExceptionHandler
        public ResultBean serviceException(ServiceException e){
            return ResultBean.error(e.getCode(),e.getMsg());
        }
    
        /**
         * Exception 异常返回
         * @param e
         * @return
         */
        @org.springframework.web.bind.annotation.ExceptionHandler
        public ResultBean serviceException(Exception e){
            return ResultBean.error(e.getMessage());
        }
    
    
    
        /**
         * 拦截 post application/json  @valid校验不通过的请求
         */
        @org.springframework.web.bind.annotation.ExceptionHandler({MethodArgumentNotValidException.class})
        @ResponseStatus(HttpStatus.BAD_REQUEST)
        public ResultBean validationException(MethodArgumentNotValidException e) {
            dealBindingResult(e.getBindingResult());
            return ResultBean.error("请求失败");
        }
    
        /**
         * 针对valid检验参数不返回具体异常,统一返回
         * @param e
         * @return
         */
        @org.springframework.web.bind.annotation.ExceptionHandler({BindException.class})
        public ResultBean validationException(BindingResult e) {
            dealBindingResult(e);
            return ResultBean.error("请求失败");
        }
    
        private void dealBindingResult(BindingResult e){
            StringJoiner joiner = new StringJoiner(",");
            if (e.hasErrors()){
                e.getFieldErrors().forEach(fieldError -> {
                    joiner.add(fieldError.getField()+"->"+fieldError.getDefaultMessage());
                });
                log.error(joiner.toString());
            }
        }
    
    }
    
    

    相关文章

      网友评论

          本文标题:Spring全局统一异常处理@ControllerAdvice+

          本文链接:https://www.haomeiwen.com/subject/lldguhtx.html