zoukankan      html  css  js  c++  java
  • springmvc 异常处理

    在之前使用springmvc,异常的处理都是在controller层中进行try-catch,在springmvc中如何设置报错时跳转的页面呢?统一进行异常处理

    1.配置错误视图解析器

    在mvc配置文件中添加下边的配置

    2.在方法前边使用@ExceptionHandler注解

    该注解只能控制当前控制器汇中的异常,因此,我们把这个方法放到BaseController中,其他的controller都继承该BaseController,下面进行测试,为了避免影响,把上边的视图解析器注释了

     //异常处理的方法
      @ExceptionHandler(RuntimeException.class)
        public String handler1(RuntimeException ex, Model model){
    
            if(ex instanceof AuthenticationException){
                System.out.println("处理方案1");
                model.addAttribute("ex",ex);
                return "error";
            }else if(ex instanceof AuthorizationException){
                System.out.println("处理方案2");
                model.addAttribute("ex",ex);
                return "error";
            }
    
    //        根据不同的异常类型,返回不同的错误界面
            return "error";
        }

    浏览器发送请求,测试是否有相应的响应

    3,使用@ControllerAdvice  +  @ExceptionHandler 注解  (推荐)

    与上面的方式差不多,不过使用这种方式避免了继承,controller不需要再继承baseController,发生异常时,就会调用该控制器中的方法

    /**
     * @ControllerAdvice:
     * 相当于是AOP,面向切面,给每一个controller都横插了该控制器
     */
    @ControllerAdvice
    public class BaseController {
    
        @ExceptionHandler({Exception.class})
        public String exception(Exception ex, Model model) {
            if (ex instanceof NullPointerException) {
                model.addAttribute("ex", ex);
                return "error";
            } else  {
                return "unauthorized";
            }
        }
    }

    异步方式返回异常:

    给方法添加@ResponseBody 注解,返回json数据:可以定义一个实体,封装异常信息;

    import lombok.Data;
    
    /**
     * Data注解,可以自动生成set和get方法
     */
    @Data
    public class Result {
    //    自定义异常状态码
        private int stats;
        //自定义异常信息
        private String messages;
    }

    需要添加lombok组件

    @ExceptionHandler(RuntimeException.class)
        @ResponseBody
        public Result handler1(RuntimeException ex){
            Result result = new Result();
            if(ex instanceof AuthenticationException){
                result.setStatusCode(501);
                result.setMessage("认证异常:"+ex.getMessage());
                System.out.println("处理方案1");
    
            }else if(ex instanceof AuthorizationException){
                result.setStatusCode(502);
                result.setMessage("授权异常:"+ex.getMessage());
                System.out.println("处理方案2");
    
            }
    
    //        根据不同的异常类型,返回不同的错误界面
            return result;
        }
  • 相关阅读:
    线程
    链表
    String 练习
    23种设计模式
    静态方法
    ASCII码及UTF-8概义
    java语法基础
    二进制、八进制、十进制、十六进制之间转换
    数组概意
    java程序安装 配置环境变量
  • 原文地址:https://www.cnblogs.com/bxl-1016/p/11354865.html
Copyright © 2011-2022 走看看