/**
* web错误 全局配置
* Created by 瓦力.
*/
@Controller
public class AppErrorController implements ErrorController {
private static final String ERROR_PATH = "/error";
private ErrorAttributes errorAttributes;
@Override
public String getErrorPath() {
return ERROR_PATH;
}
@Autowired
public AppErrorController(ErrorAttributes errorAttributes) {
this.errorAttributes = errorAttributes;
}
/**
* Web页面错误处理
*/
@RequestMapping(value = ERROR_PATH, produces = "text/html")
public String errorPageHandler(HttpServletRequest request, HttpServletResponse response) {
int status = response.getStatus();
switch (status) {
case 403:
return "403";
case 404:
return "404";
case 500:
return "500";
}
return "index";
}
/**
* 除Web页面外的错误处理,比如Json/XML等
*/
@RequestMapping(value = ERROR_PATH)
@ResponseBody
public ApiResponse errorApiHandler(HttpServletRequest request) {
RequestAttributes requestAttributes = new ServletRequestAttributes(request);
Map<String, Object> attr = this.errorAttributes.getErrorAttributes(requestAttributes, false);
int status = getStatus(request);
return ApiResponse.ofMessage(status, String.valueOf(attr.getOrDefault("message", "error")));
}
private int getStatus(HttpServletRequest request) {
Integer status = (Integer) request.getAttribute("javax.servlet.error.status_code");
if (status != null) {
return status;
}
return 500;
}
}
请帮忙逐行讲解一下统一异常处理类为什么这么写。以及RequestAttributes是什么?
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
1条回答 默认 最新
你知我知皆知 2024-08-07 18:38关注以下回答参考 皆我百晓生、券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。
统一异常处理类(AppErrorController)的解析与说明
1.
@Controller注解@Controller注解是 Spring MVC 中用于标识一个控制器的注解。- 它告诉 Spring 框架这个类应该被视为 MVC 控制器。
2.
getErrorPath()方法getErrorPath()是一个返回特定路径的方法,它可以根据不同的错误状态码生成相应的错误页面或JSON响应。- 在这里,我们定义了一个全局的错误路径
/error。
3.
@RequestMapping注解和@ResponseBody助手方法@RequestMapping注解被用来映射到一个请求处理器,它告诉 Spring 框架在哪个 URL 路径下执行这个处理器。@ResponseBody助手方法用于将处理后的数据作为 JSON 或 XML 返回给客户端。
4.
errorPageHandler方法- 这个方法是一个响应处理逻辑,当遇到特定的状态码时(例如:403、404 和 500),它会根据这些状态码返回正确的 HTML 页面或 JSON 数据。
- 当遇到其他状态码时,默认会返回
/error/index.html,即默认的错误页面。
5.
errorApiHandler方法- 这个方法是处理非 Web 页面的错误情况,比如 Json/Xml 错误。
- 它接收 HTTP 请求,并调用
errorApiHandler方法来获取错误信息。 - 使用
ServletRequestAttributes类获取当前请求上下文,然后使用errorAttributes获取错误处理上下文对象。 - 最后,返回一个带有错误消息的 API 响应对象。
6.
getStatus()方法getStatus()方法负责从请求中提取错误状态码,如果找不到,则返回默认值 500。
RequestAttributes
RequestAttributes是一个接口,表示一个请求上下文中的属性。在Spring MVC中,每个请求都会有一个对应的RequestAttributes实例。
7. RequestAttributes 实现
RequestAttributes接口实现类可以包含各种属性,例如HttpServletRequest的getAttribute方法返回的数据类型。
8. RequestAttributes 实例化
- 在
AppErrorController的构造函数中,通过注入ErrorAttributes实例化RequestAttributes实例。
综上所述,
AppErrorController将多个错误处理功能整合在一起,实现了对不同错误状态的统一处理。它的设计思路清晰,能够有效地应对各种类型的HTTP错误。解决 无用评论 打赏 举报