在之前使用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;
}
来源:oschina
链接:https://my.oschina.net/u/4354403/blog/3429854