SpringBoot入门(八)异常处理/Servlet组件注入/定制化

目录

第七章 Web开发

7.9 错误处理

7.9.1 默认规则

7.9.2 定制错误处理逻辑

7.9.3 异常处理自动配置原理

7.9.4 异常处理步骤流程

7.10 Web原生组件注入(Servlet、Filter、Listener)

7.10.1 使用Servlet API

7.10.2 使用RegistrationBean

7.10.3 一个小问题

7.11 嵌入式Web容器

7.11.1 切换嵌入式Servlet容器

7.11.2 定制Servlet容器

7.12 定制化原理

7.12.1 定制化的常见方式

7.12.2 原理分析套路


第七章 Web开发

7.9 错误处理

7.9.1 默认规则

   参考:Web

  • 默认情况下,SpringBoot提供一个映射/error,处理所有错误
  • 对于机器客户端,它将生成JSON响应,其中包含错误、HTTP状态和异常消息的详细信息,将这些信息显示在页面上

  • 对于浏览器客户端,响应一个"whitelabel(白页)"错误视图,以HTML格式呈现相同的数据

  • 要进行自定义,可以添加View解析为error

    • 要完全替换默认行为,可以实现ErrorController,并注册该类型的Bean定义,或者添加ErrorAttributes类型的组件,以实现使用现有机制替换其内容

    • public/templates下的error文件夹下的4xx、5xx页面会被自动解析

7.9.2 定制错误处理逻辑

  • 自定义错误页
    • error/404.html error/5xx.html:有精确的错误状态码页面就匹配精确,没有就找 4xx.html,如果都没有就触发白页
  • @ControllerAdvice+@ExceptionHandler处理全局异常,底层是处理器异常解析器ExceptionHandlerExceptionResolver支持的
/**
 * 处理整个Web controller的异常
 */
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler({ArithmeticException.class,NullPointerException.class})   //处理异常
    public String handleArithException(Exception e){
        log.error("异常是:{}",e);
        return "login";//返回一个视图地址
    }
}
  • @ResponseStatus+自定义异常:底层是ResponseStatusExceptionResolver,把responsestatus注解的信息底层调用response.sendError(statusCode, resolvedReason);tomcat发送的/error
@ResponseStatus(value = HttpStatus.FORBIDDEN,reason = "用户数量太多") //可以传入Http状态码、错误原因
public class UserTooMuchException extends RuntimeException{//自定义异常类
    public UserTooMuchException() {
        
    }

    public UserTooMuchException(String message) {
        super(message);
    }
}
  • Spring底层的异常,如参数类型转换异常、参数不存在异常。由处理器异常解析器DefaultHandlerExceptionResolver处理框架底层的异常

    • response.sendError(HttpServletResponse.SC_BAD_REQUEST, ex.getMessage());
  • 自定义实现HandlerExceptionResolver处理异常,实现HandlerExceptionResolver接口,修改优先级后可以作为默认的全局异常处理规则
@Order(value = Ordered.HIGHEST_PRECEDENCE)//给当前异常解析器一个最高优先级,超过之前的DefaultHandlerExceptionResolver
@Component
public class CustomerHandlerExceptionResolver implements HandlerExceptionResolver {
    @Override
    public ModelAndView resolveException(HttpServletRequest request,
                                         HttpServletResponse response,
                                         Object handler, Exception ex) {
        try{
            response.sendError(511,"自定义的错误状态码");//也会被5xx.html页面处理
        } catch (IOException e) {
            e.printStackTrace();
        }
        return new ModelAndView();
    }
}
  • ErrorViewResolver,实现自定义处理异常(最底层的一种异常处理)
    • response.sendError,error请求就会转给controller
    • 你的异常没有其他任何人能处理,tomcat底层response.sendError,error请求就会转给controller
    • basicErrorController要去的页面地址是ErrorViewResolver

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值