前因
-
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这个类来处理异常信息;
-
出现以下错误:
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.
解决方案:
-
application.yml
server: error: path: error/fail
-
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("被拦截,请稍后重试"); } }
应该是没有配置全局异常导致的前因以及需要配置一个额外的控制层;
-
随便请求接口即可看到效果