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