java - Spring 中的 404 错误(java config / no web.xml)
问题描述
尝试在 Web 应用程序中提供自定义 404 错误页面,据我所知,该页面使用 Java Config(因此没有 web.xml)。
我们有以下版本的相关库:spring ("5.1.2.RELEASE")、spring-security ("5.1.1.RELEASE")。
免责声明
我在 StackOverflow 中检查了不同的方法。请不要为 web.xml、Thymeleaf 或 Spring Boot 推荐结果。这不适用。
其中; 我尝试了以下方法:
没有产生预期的结果(即,仍然得到默认的网络服务器布局和错误)。
控制器注释方法
异常包
package ...; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.NoHandlerFoundException; @ControllerAdvice public class GlobalExceptionHandler { // Option A (used as an alternative to option B) //@ExceptionHandler(Exception.class) //public String handle(Exception ex) { // return "redirect:/404"; //} @RequestMapping(value = {"/404"}, method = RequestMethod.GET) public String NotFoundPage() { return "404"; } // Option B (used as an alternative to option A) @ExceptionHandler(Exception.class) public ResponseEntity<String> handleNoHandlerFoundException(GlobalExceptionHandler ex) { ResponseEntity responseEntity = new ResponseEntity<>(new RestClientException("Testing exception"), HttpStatus.NOT_FOUND); return responseEntity; } }
初始化类
package ...; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.http.ResponseEntity; import org.springframework.http.HttpStatus; import org.springframework.web.servlet.NoHandlerFoundException; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; @Configuration @ComponentScan("...") @EnableWebMvc @EnableTransactionManagement @PropertySource("classpath:application.properties") public class WebAppConfig extends WebMvcConfigurerAdapter { @ExceptionHandler({ Exception.class }) public ResponseEntity<RestClientException> handle(NoHandlerFoundException e) { return new ResponseEntity<>(new RestClientException("Testing exception"), HttpStatus.NOT_FOUND); } ... @Override public void addViewControllers(ViewControllerRegistry registry) { super.addViewControllers(registry); registry.addViewController("/404.jsp").setViewName("404"); } }
还有一个Initializer
类(public class Initializer implements WebApplicationInitializer
),它似乎与一些建议的选项(定义here和here)冲突;所以 webapp-init 类没有被修改。
web.xml 方法
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="ROOT" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<error-page>
<error-code>404</error-code>
<location>/error</location>
</error-page>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error</location>
</error-page>
</web-app>
404.jsp
或文件被放置(目前404.html
用于测试目的在以下所有位置):
src/main/resources
├── ...
├── error
│ └── 404.html
├── public
│ ├── 404.html
│ └── error
│ └── 404.html
├── templates
│ └── 404.html
└── ...
src/main/webapp/WEB-INF/
├── error.jsp
├── tags
│ └── ...
└── views
├── 404.html
├── 404.jsp
├── error.jsp
└── ...
知道什么是缺失或错误的吗?
解决方案
阅读 Spring Boot 文档,这对我有用:
@Bean
public ErrorPageRegistrar errorPageRegistrar() {
return registry -> registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/index.html")); }
这相当于 web.xml。
推荐阅读
- bash - 如果所有值都相同,则循环遍历 bash 测试中的列 - AWK
- laravel - Laravel 8 - 优雅地处理失败的删除请求
- python - 为什么 python-docx 在应该为空时返回带有文本的单元格?
- macos - 推送到 Github 时未注意到令牌
- security - 如何找出谁克隆了我的 SSID 以及为什么(EvilTwin?)?
- python - python打包离线pdfplumber
- java - 有没有办法让消费者只使用 config/properties 文件来停止收听主题?
- javascript - d3js如何启用拖动或捏/缩放功能到我的地图
- c - 尝试使用来自用户的输入设置二维数组的大小
- google-bigquery - IS NULL 返回 NOT NULL 值