当前位置: 首页 > 知识库问答 >
问题:

如何用Spring boot 2.5.2配置500错误页面,默认设置不工作

盖泽宇
2023-03-14

我依靠Spring启动来处理500(内部服务器错误)。遵循了各种链接,其中提到我可以使用以下属性自定义我的Web应用程序

server.error.path=/error
server.error.whitelabel.enabled=false

我还将我的自定义错误页面控制器编写为:

@Controller
public class GlobalErrorController implements ErrorController {

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    @RequestMapping("/error")
    public String handleError(HttpServletRequest request) {
        Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
        log.error("Error occurred!");
        if (status != null) {
            Integer statusCode = Integer.valueOf(status.toString());
            // handle all the 400 error codes
            if (statusCode != null && statusCode % 400 < 100) {
                return "error/4xx";
            } else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
                return "error/500";
            }
        }
        return "error/genericError";
    }

}

此控制器从未被调用,我只看到服务器错误页面,控制台错误如下:

我可以看到,控制台中的/error页明显抛出了错误。以下是错误日志的一部分:

2021 7月27日16:13:28.769错误22040---[nio-8080-exec-1]o.a.c.c.c.[localhost]175:异常处理错误页[错误代码=0,位置=/错误]

这里需要注意的一点是,过滤器中会抛出异常,因为我在测试应用程序的行为,当其中一个服务宕机时。但我仍然应该使用/error-controller获得我所期望的页面。

更新:我做了一些进一步的研究,发现过滤器中抛出的异常不会由全局异常处理程序处理。为了通过spring的异常处理程序处理异常,我添加了这个过滤器,它捕获任何其他过滤器引发的异常。代码如下:

@Component
public class ExceptionHandlerFilter extends OncePerRequestFilter {

    private final Logger log = LoggerFactory.getLogger(getClass());

    @Autowired
    @Qualifier("handlerExceptionResolver")
    private HandlerExceptionResolver resolver;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        try {
            filterChain.doFilter(request, response);
        } catch (RuntimeException ex) {
            log.error("Spring Security Filter Chain Exception:", ex);
            resolver.resolveException(request, response, null, ex);
        }
    }

}

我还为此创建了一个异常处理程序,如下所示:

@ControllerAdvice
public class GlobalExceptionHandler {
    
    private final Logger log = LoggerFactory.getLogger(this.getClass());
   
    @ExceptionHandler(RuntimeException.class)
    public ModelAndView handleError(HttpServletRequest req, RuntimeException ex) 
    {
       log.error("Request: " + req.getRequestURL() + " raised " + ex);

       ModelAndView mav = new ModelAndView("error/500");
       mav.addObject("exception", ex);
       mav.addObject("url", req.getRequestURL());
       return mav;
     }

}

现在的问题是,它只显示空白页,没有任何内容。我希望看到位于错误/500的自定义错误页。

共有1个答案

南宫俊喆
2023-03-14

这个代码对我来说很好用。你能把你的课程改成下面的代码并告诉结果吗?

  • error_404error_500是自定义的html错误页面。
@Controller
public class MyErrorController implements ErrorController {

    @RequestMapping("/error")
    public String handleError(HttpServletRequest request) {
        Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);

        if (status != null) {
            int statusCode = Integer.parseInt(status.toString());
            switch (statusCode) {
                case 404:
                    return "error_404";

                case 500:
                    return "error_500";
            }
        }
        return "error";
    }

    @Override
    public String getErrorPath() {
        return null;
    }
}
server.error.whitelabel.enabled=false
spring.mvc.throw-exception-if-no-handler-found=true
server.error.path=/error
 类似资料:
  • 与Jquery Mobile自动初始化共同协作 Working with Jquery Mobile's Auto-initialization 不像其他的Jq项目,比如jq和jq ui,Jquery Mobile会在加载到增强特性时马上应用它(远早于document.ready事件发生时)。这些特性会基于Jquery Mobile的默认配置应用,是针对默认的情形设计的,他可能符合你的需求,也可能

  • 问题内容: 我创建了一个域: 我试图设置默认值: 但是得到了错误: 错误:列“ 00000”不存在 然后我设法使用设置了默认值,但是我认为它被强制转换为而不是。我尝试过, 但也没有成功。 如何获取默认值作为文本而不出现错误? 我使用了PostgreSQL。 问题答案: 在SQL中,双引号 用于引用名为“选择”的列或表 例如,SQL中的字符串常量是由单引号()界定的任意字符序列。因此,这与双引号字符

  • 问题内容: 我发现在hibernate配置文件中,我们可以设置参数: 现在,我正在使用JPA,我也想这样做。否则,我必须将参数添加到每个@Table注释中,例如: 据我了解,此参数应该在配置的这一部分中: …但是我在Google中找不到它的名字。有任何想法吗? 问题答案: 也不知道为此的JPA属性。但是,您可以仅将Hibernate属性(假设您使用Hibernate作为提供程序)添加为 hiber

  • 问题内容: 我的UIPickerView有问题。我在欧盟AP和NA中有3个值。当我启动该应用程序时,似乎选择了EU,但是当我做出选择时,我只会返回,现在当我触摸UIPickerView时,EU值被选中,然后从NSLog中返回。 我的问题是: 当用户仅启动应用程序并且什么都不触摸时,如何定义默认值(不仅是标签),该值将被选中。 编辑: 这是我的代码来获取所选项目: 问题答案: TL:DR版本: 您没

  • 问题内容: 我需要在活动开始时为ListPreference设置默认值。我试过了,但它使列表的firts条目成为默认条目。我需要它,因为我必须检查一个条件并将满足该条件的值设置为默认值,因此我认为无法从xml文件(带有)中完成此操作 例如,假设我在arrays.xml中具有以下值数组: 在PreferenceScreen xml中: 在活动中,我想做这样的事情: 但这是行不通的,因为它将默认设置为

  • 本文向大家介绍如何设置MySQL默认值NONE?,包括了如何设置MySQL默认值NONE?的使用技巧和注意事项,需要的朋友参考一下 要在MySQL中设置默认值,您需要使用DEFAULT关键字。让我们首先创建一个表- 我们为插入时未输入的值设置了DEFAULT以上。现在,让我们使用insert命令在表中插入一些记录。我们尚未在此处为某些行插入值。默认设置在那里- 使用select语句显示表中的所有记