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;
    }

 

posted on 2019-08-14 21:36  一梦南柯  阅读(303)  评论(0编辑  收藏  举报

导航