我需要覆盖 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>
最佳答案
根据我的理解,TomcatServletWebServerFactory
和 WebServerFactoryCustomizer
都无法在外部 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/