SpringBoot自定义状态码错误页:无法跳转至自定义错误页问题
解决Spring Boot无法重定向到自定义错误页面的问题
问题根源分析
你的配置和代码存在几个关键问题,导致自定义错误页面无法生效:
@RestController注解误用:该注解会将返回值直接作为HTTP响应体返回(等同于@Controller + @ResponseBody),而非将字符串视为视图名称去匹配对应的页面文件。- 资源映射配置冲突:
spring.web.resources.add-mappings: false会关闭Spring默认的资源映射规则,可能导致视图解析器无法找到你的自定义错误页面文件。 - API版本兼容性(可选):Spring Boot 2.3+版本中
ErrorController接口已被标记为过时,虽仍可使用,但推荐采用更现代的错误处理方式。
修复步骤
1. 修改控制器注解
将@RestController替换为@Controller,这样返回的字符串会被视图解析器处理,定位到对应的错误页面:
@Controller @RequiredArgsConstructor public class CustomErrorController implements ErrorController { private static final String PATH = "/error"; @RequestMapping("/error") public String handleError(HttpServletRequest request) { Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); if (status != null) { Integer statusCode = Integer.valueOf(status.toString()); if (statusCode == HttpStatus.NOT_FOUND.value()) { return "error-404"; } else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) { return "error-500"; } } return "error"; } }
2. 调整资源映射配置
如果没有特殊需求,建议移除spring.web.resources.add-mappings: false配置,让Spring默认处理资源和视图映射。若必须关闭该配置,需确保视图解析器已正确配置,能找到你的错误页面文件(比如Thymeleaf模板需放在src/main/resources/templates/目录,JSP需放在src/main/webapp/WEB-INF/views/目录)。
3. 确认错误页面存在
确保自定义错误页面文件(如error-404.html、error-500.html、error.html)存在于视图解析器对应的目录中,文件名与控制器返回的字符串完全匹配。
4. 检查路径拦截
确保没有其他@Controller或过滤器拦截/error路径,避免自定义错误处理逻辑被覆盖。
替代方案(Spring Boot 2.3+推荐)
对于新版本Spring Boot,建议使用@ControllerAdvice结合@ExceptionHandler实现全局错误处理,示例如下:
@ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(value = Exception.class) public String handleException(HttpServletRequest request, Exception e) { Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE); if (status != null) { Integer statusCode = Integer.valueOf(status.toString()); if (statusCode == HttpStatus.NOT_FOUND.value()) { return "error-404"; } else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) { return "error-500"; } } return "error"; } }
使用该方案时,同样需要确保server.error.whitelabel.enabled: false,且视图文件配置正确。
内容的提问来源于stack exchange,提问作者Rupesh Sunuwar
相关产品推荐
相关产品推荐

