如何使用 Spring Boot 创建 404 控制器?

How do I create a 404 controller using Spring Boot?

我想 return 使用 SpringBoot 的自定义 404 错误,但我希望能够向它添加一些服务器端逻辑,而不仅仅是提供静态页。

1.我在 application.properties

中关闭了默认的白标签页面

error.whitelabel.enabled=false

2。我在 resources/templates

下添加了 Thymeleaf error.html

顺便说一句,这行得通。该页面已提供,但未调用控制器。

3。我创建了一个 class Error 作为 "Controller"

package com.noxgroup.nitro.pages;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/error")
public class Error {

    @ExceptionHandler
    public String index() {
        System.out.println("Returning Error");
        return "index";
    }

}

很遗憾,我没有在控制台的任何地方看到 Returning Error

我正在使用带有 Spring 引导的嵌入式 Tomcat。我已经看到了各种选项,但似乎都不起作用,包括使用 @ControllerAdvice、删除 RequestMapping 等。对我来说都不起作用。

servlet 容器将在到达 Spring 之前接收到 404,因此您需要在 servlet 容器级别定义一个错误页面,该页面将转发到您的自定义控制器。

@Component
public class CustomizationBean implements EmbeddedServletContainerCustomizer {

  @Override
  public void customize(ConfigurableEmbeddedServletContainer container) {
    container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error"));
  }

}

我发现最简单的方法是实现 ErrorController。

@Controller
public class RedirectUnknownUrls implements ErrorController {

    @GetMapping("/error")
    public void redirectNonExistentUrlsToHome(HttpServletResponse response) throws IOException {
        response.sendRedirect("/");
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}