问题描述:
如果网络请求错误,默认返回一个json数据,但是在页面上却只能看到404;返回的json数据如下所示:
{
"timestamp": "2021-08-04T06:38:20.294+00:00",
"status": 404,
"error": "Not Found",
"path": "/"
}
捕获异常,并显示错误信息具体实现方法
步骤一:创建UserNotException,表示用户不存在异常,
public class UserNotException extends RuntimeException {
public UserNotException() {
super("用户不存在");
}
}
步骤2:在UserController中,如果前端请求用户名不存在,则抛出异常
@PostMapping("/aaa")
@ResponseBody
public String alogin(@RequestParam("user") String userName){
if (userName.equals("aaa")){
throw new UserNotException();
}
return "helloa";
}
步骤3:创建全局异常处理器,使用@ExceptionHandler(UserNoteException.class)捕获该异常
/**
* 异常处理器
*/
@ControllerAdvice//表示可接收全局异常,
public class MyExceptionHandler {
@ExceptionHandler(UserNotException.class)//对于该异常的处理方式
@ResponseBody
public Map<String, Object> handleException(Exception e){
Map<String,Object>map=new HashMap<>();
map.put("code","user.notexit");
map.put("message","用户不存在");
return map;
}
}
至此,可实现基本的异常处理问题!!!!!即当用户不存在时,页面可显示json数据
BasicErrorController处理错误请求,/error;
参照ErrorMvcAutoConfiguration----------错误处理的自动配置类
自定义错误返回内容具体实现方法
步骤1:仍旧采用MyExceptionHandler接收全局异常,但是不直接返回异常信息,而是转为/error请求,并使用request来携带数据
/**
* 异常处理器
*/
@ControllerAdvice//表示可接收全局异常,
public class MyExceptionHandler {
@ExceptionHandler(UserNotException.class)//对于该异常的处理方式
public String handleException(Exception e, HttpServletRequest request){
Map<String,Object>map=new HashMap<>();
map.put("code","user.notexit");
map.put("message","用户不存在");
request.setAttribute("ext",map);
return "forward:/error";
}
}
步骤2:因为BasicErrorController类会响应/error请求,该控制器中包含ErrorAttributes属性,可以利用该自定义错误信息
因此通过继承该方法来自定义错误信息
@Component
public class MyErrorAttributes extends DefaultErrorAttributes {
@ResponseBody
@Override
public Map<String, Object> getErrorAttributes(WebRequest webRequest, ErrorAttributeOptions options) {
Map<String, Object> errorAttributes = super.getErrorAttributes(webRequest, options);
errorAttributes.put("company","sdee");
Map<String,Object> ext = (Map<String, Object>) webRequest.getAttribute("ext", 0);
errorAttributes.put("ext",ext);
return errorAttributes;
}
}
最后的实现效果如下图所示: