SpringBoot自定义ErrorController

本文探讨了SpringBoot中自定义异常处理机制,并详细解释了如何解决自定义ErrorController与默认ErrorController之间的冲突问题。

前因

  1. SpringBoot默认有自定义异常处理的体系,在做SpringBoot项目的时候,如果是抛出了运行时异常,springBoot并会对异常进行处理,返回如下异常信息:

    {
        "timestamp": 1517294278132,
        "status": 500,
        "error": "Internal Server Error",
        "exception": "com.lgy.common.exception.BusinessException",
        "message": "[001]自定义的uncheck 异常!",
        "path": "/validateExceptionTest"
    }
    

    追究其原因,发现SpirngBoot出现异常信息时候,会默认访问/error,springBoot种有BasicErrorController这个类来处理异常信息;

  2. 出现以下错误:

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'basicErrorController' method 
     org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#error(HttpServletRequest)
     to { /error}: There is already 'myErrorController' bean method
     com.test.MyErrorController#myerror() mapped.
    

解决方案:

  1. application.yml

    server:
      error:
        path: error/fail
    
  2. ErrorController

    /**
     * @author: zhangenke
     * @date: 2020/12/22 on 6:01 下午
     * @desc: 解决自定义server.error.path后,自带的ErrorController与自定义errorController冲突问题
     *     <p>如果自定义server.error.path后,错误路径就是前缀+定义名称。否则就是前缀+/error
     *     <p>${server.error.path:${error.path:/error}} 如果前面不存在则找:后面的值
     */
    @Slf4j
    @ApiIgnore
    @RestController
    @RequestMapping("${server.error.path:${error.path:/error}}")
    public class ErrorController implements org.springframework.boot.web.servlet.error.ErrorController {
    
      private static final String PATH = "/随便命名-跟他没有半毛钱关系";
    
      @Override
      public String getErrorPath() {
        return PATH;
      }
    
      @RequestMapping
      public Result<Object> doHandleError() {
        return Result.fail("被拦截,请稍后重试");
      }
    }
    

    应该是没有配置全局异常导致的前因以及需要配置一个额外的控制层;

  3. 随便请求接口即可看到效果
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值