Spring boot—自定义错误处理
首先明确:springboot会跟据异常的错误代码自动返回静态资源下error文件夹下的对应的错误代码的hmtl
例如:错误代码404,会响应/static/error/404.html
思路:首先自定义个错误异常类,并在controller中出错抛出该异常,再使用springmvc中@ControllerAdvice 创建一个处理异常的类,在类中写方法并使用@ExceptionHandler注解标注出什么类型的错误使用该方法在方法中定义错误信息,也可以向request中存放信息(注意里面要定义错误的code)javax.servlet.error.status_code,最后重定向到ERROR页面
1.定义错误异常类
/**
* 一个异常类 继承运行异常RuntimeException
* 构造器直接向super发送信息
*/
public class UserExceptionHandler extends RuntimeException {
public UserExceptionHandler() {
super("用户不存在");
}
}
2.在controller可以抛出定义的异常类
@Controller
public class UserController {
@ResponseBody
@RequestMapping("/login")
public String login(@RequestParam("user") String user){
if(!user.equals("aaa")){
//抛出自定义的异常
throw new UserExceptionHandler();
}
return "Hello World";
}
}
3.定义一个处理异常的类(意思就是当有异常抛出,会执行这个对应的类型类,实现错误消息显示到页面)
/**
* springMVC处理异常的注解
*/
@ControllerAdvice
public class MyUserException {
//处理什么类型的异常
@ExceptionHandler(UserExceptionHandler.class)
public String handlerException(Exception e, HttpServletRequest request){
Map<String,Object> map = new HashMap<>();
//给当前request中放入404的错误以及自定义的信息
//这里定义404是因为会由springboot自动找对应静态资源下的404html
request.setAttribute("javax.servlet.error.status_code",404);
request.setAttribute("abc","这是User的自己定义的错误信息");
//转发
return "forward:/error";
}
}
4.如果需要给异常返回的数据添加一些自定义数据
//加入到容器中
@Component
//继承springmvc的默认异常存参数的类
public class MyErrorAttributes extends DefaultErrorAttributes {
//重写错误参数方法
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, boolean includeStackTrace) {
//获取错误异常的参数
Map<String,Object> map = super.getErrorAttributes(webRequest, includeStackTrace);
//向错误异常参数map中放入自己想放入的参数
map.put("componey","jjj");
//也可以从webRequest中获取某个定义的异常处理类中获取request值放入到map中
Object a = webRequest.getAttribute("abc",0);
map.put("msg",a);
return map;
}
}