开发者

SpringBoot全局异常捕获参数以及参数异常的解决方案

目录
  • 一.全局异常捕获
    • 1.1 全局捕获
    • 1.2 基础异常
    • 1.3 业务参数异常
  • 二.验证
    • 2.1 定义实体类
    • 2.2 定义接口
  • 总结

    现在比较常用的方式是给前端返回jsON,但是有些时候程序出现一些异常,导致前端页面报错不是很友好,所以就需要对项目进行全局的异常捕获,返回给前端固定的格式,进行友好的处理!

    话不多说,开始写代码

    一.全局异常捕获

    1.1 全局捕获

    @Slf4j
    @RestControllerAdvice(annotations = {RestController.class})
    public class BaseExceptionHandler {
    
        /**
         * <p>
         *       全局Base异常处理
         * </p>
         * @version 1.0.0
         * @author Dylan
         * @since 2020/2/27
         * @param e
         */
        @ExceptionHandler({BaseException.class,BusinessException.class})
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        public R customExceptionHandler(BaseException e) {
            sysLog();
            log.info("自定义异常 ---> {}",e);
            return R.error(e.getCode(),e.getMsg());
        }
    
        /**
         * <p>
         *       其他类型的异常处理
         * </p>
         * @version 1.0.0
         * @author Dylan
         * @since 2020/2/27
         * @param e
         */
        @Exce编程ptionHandler({Exception.class})
        @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
        public R customExceptionHandler(Exception e) {
            sysLog();
            log.info("未知的运行异常 ---> ",e);
            return R.error();
        }
    
        /**
         * <p>
         *       参数异常处理
         * </p>
         * @version 1.0.0
         * @author Dylan-haiji
         * @since 2020/2/28
         * @param exception
         */
        @ExceptionHandler(value= MethodArgumentNotValidException.class)
        public R methodNotValidHandler(MethodArgumentNotValidException exception) {
            sysLog();
            log.info("参数异常 ---> ",exception);
            List<FieldError> fieldErrors = exception.getBindingResult().getFieldErrors();
            return  R.error(fieldErrors.get(0).getDefaultMessage());
        }
    
        /**
         * <http://www.devze.com;p>
         *       统一日志输出
         * </p>
         * @version 1.0.0
         * @author Dylan-haiji
         * @since 2020/2/28
         * @param
         * @return void
         */
        private void sysLog(){
            HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
            String requestUri = request.getRequestURI();
            lophpg.info("异常  method ---> {}",request.getMethod());
            log.info("异常 requestURI ---> {}",requestUri);
        }
        
    }

    1.2 基础异常

    public class BaseException extends RuntimeException{
        private Integer code;
        private String msg;
    
        public BaseException(Integer code, String msg){
            this.code = code;
            this.msg = msg;
        }
    
        public BaseException( String msg){
            this.code = 500;
            this.msg = msg;
        }
    
    }

    1.3 业务参数异常

    public class BusinessException extends BaseException {
    
        public BusinessException(Integer code, String msg) {
            super(code, msg);
        }
    
        public BusinessException() {
            super(ConstantUtils.BUSINESS_DATA);
        }
    
        public BusinessException(String msg) {
            super(msg);
        }
    
    }

    二.验证

    通过上面的配置,我们可以进行全局的异常捕获,接下来我们以参数验证为例进行验证是否可用!

    2.1 定义实体类

    public class Demo implements Serializable {
        
        @NotBlank(message = "请选择时间")
        private String endDate;
       
        @NotB编程客栈lank(message = "请选择范围类型")
        private String value;
    
    }

    2.2 定义接口

     @PostMapping(value = "list")
     public R getOve编程客栈rView(@RequestBody @Valid Demo demo){
        return R.ok();
     }
    

    这是我们调用接口,直传一个参数!达到了我们的预期效果

    SpringBoot全局异常捕获参数以及参数异常的解决方案

    当然我们处理业务的时候也可进行异常的抛出,这样也会进行全局的捕获!

    SpringBoot全局异常捕获参数以及参数异常的解决方案

    这样的接口返回就非常的友好了! 

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜