java - Spring Boot自定义错误页面在部署在外部容器中时不起作用

标签 java spring spring-boot

我需要覆盖 Spring Boot 默认错误页面。我注入(inject)了WebServerFactoryCustomizer bean并指定了相应的错误页面。这在 spring boot 嵌入式 tomcat 中工作正常,但当我部署到外部 tomcat 时,它仍然跳转到 spring boot 的默认错误页面。 我的配置中缺少它吗?感谢您的帮助:)

这里是代码:

ErrorConfig.java

 @Configuration
public class ErrorConfig {

    @Bean
    public WebServerFactoryCustomizer<TomcatServletWebServerFactory> sessionManagerCustomizer() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        return server -> {
            ErrorPage error400 = new ErrorPage(HttpStatus.BAD_REQUEST, "/error/400");
            ErrorPage error500 = new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500");
            ErrorPage error404 = new ErrorPage(HttpStatus.NOT_FOUND, "/error/404");
            ErrorPage error403 = new ErrorPage(HttpStatus.FORBIDDEN, "/error/403");
            ErrorPage error503 = new ErrorPage(HttpStatus.SERVICE_UNAVAILABLE, "/error/503");
            server.addErrorPages(error400, error500, error404, error403, error503);
        };
    }
}

ErrorController.java

@Controller
public class ErrorController {

    @RequestMapping(value = "/error/{code}")
    public String error(@PathVariable int code, Model model) {
        String page = "/error/error";
        switch (code) {
            case 403:
                model.addAttribute("code", 403);
                page = "/error/403";
                break;
            case 404:
                model.addAttribute("code", 404);
                page = "/error/404";
                break;
            case 500:
                model.addAttribute("code", 500);
                page = "/error/500";
                break;
            case 503:
                model.addAttribute("code", 503);
                page = "/error/503";
                break;
            default:
                model.addAttribute("code", 404);
                page = "/error/404";
        }
        return page;
    }

}

pom.xml(part of)

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

最佳答案

根据我的理解,TomcatServletWebServerFactoryWebServerFactoryCustomizer 都无法在外部 tomcat 容器中工作,特别是当提供了 spring-boot-starter-tomcat 的范围时。我认为您可以使用 @ExceptionHandler 注释和 ErrorController 接口(interface)将请求重定向到您想要的页面(例如 404/500 等)。例如

@RestController
@ControllerAdvice
public class ExceptionController implements ErrorController {
    private static final String ERROR_PATH = "/error";

    @RequestMapping(value = "/error/{code}")
    public String handleError(@PathVariable int code) {
        String rtn = null;
        switch (code) {
            case 404:
                rtn = "Page not found";
                break;
            case 500:
                rtn = "Internal server error";
                break;
            default:
                rtn = "error";
                break;
        }
        return rtn;
    }

    @RequestMapping(value = ERROR_PATH)
    public void handleError(HttpServletRequest request, HttpServletResponse response) throws IOException {
        response.sendRedirect("error/404");
    }

    /**
     * implement ErrorController to handle 404
     */
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }

    @ExceptionHandler(Exception.class)
    public void handleException(HttpServletRequest request, HttpServletResponse response, Exception e) throws IOException {
        response.sendRedirect("error/500");
    }
}

关于java - Spring Boot自定义错误页面在部署在外部容器中时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50959459/

相关文章:

java - 如何创建存储库类的 bean

java - Spring Boot 的外部库文件夹

java - 如何在带有 Zookeeper 和 ActiveMQ 的集群环境中使用 Apache Camel

java - 为什么我的程序在没有相应的打印语句的情况下打印值?

java - 尝试从java访问MySQL,但它不工作

java - Spring - 在凭据错误的情况下返回非公开响应

Spring集成-文件:inbound-channel-adapter - remove original file

java - Hibernate实体映射错误 "Duplicate entry ' 1 0' for key"

java - android gradle构建错误?

java - @Autowire 注解的问题