whyyouhitme_ 2019-01-20 20:24 采纳率: 22.2%
浏览 693

请帮忙逐行讲解一下统一异常处理类为什么这么写。以及RequestAttributes是什么?

/**
 * 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;
    }
}
  • 写回答

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 接口实现类可以包含各种属性,例如 HttpServletRequestgetAttribute 方法返回的数据类型。

    8. RequestAttributes 实例化

    • AppErrorController 的构造函数中,通过注入 ErrorAttributes 实例化 RequestAttributes 实例。

    综上所述,AppErrorController 将多个错误处理功能整合在一起,实现了对不同错误状态的统一处理。它的设计思路清晰,能够有效地应对各种类型的HTTP错误。

    评论

报告相同问题?