下面是对于“SpringBoot自定义/error路径失效的解决”的完整攻略:
背景
在使用SpringBoot开发web应用的过程中,我们有时需要自定义error处理页面。按照惯例,我们可以将静态页面放在/resources/static/error
路径下,然后在Controller层中自定义处理对应的erroCode,比如404、500等。这样,当用户访问出错时,SpringBoot便会自动跳转到对应的错误页面。
问题
但是,有时我们会发现自定义/error路径失效,比如在访问不存在的URL时,默认跳转到SpringBoot自带的错误提示页面,而不是我们自定义的页面。那么,我们该如何解决这个问题呢?下面给出两种解决方法。
方法一:自定义ErrorController
在SpringBoot中,如果我们需要自定义error处理的显示界面,我们可以通过自定义一个ErrorController来实现,这也是SpringBoot官方推荐的方式。
具体步骤如下:
- 创建一个类,继承
org.springframework.boot.web.servlet.error.ErrorController
,如下所示:
```
@Controller
public class MyErrorController implements ErrorController {
private final static String ERROR_PATH = "/error";
@RequestMapping(ERROR_PATH)
public String handleError(HttpServletRequest request, ModelMap modelMap) {
// 这里处理自定义的error错误页面,比如获取statusCode、Exception等信息,进行处理
return "/error/404.html";
}
@Override
public String getErrorPath() {
return ERROR_PATH;
}
}
```
在该类中,我们定义了一个handleError
方法,用于自定义处理错误请求。需要注意的是,这里的返回值是一个视图名称,对应着/resources/static/error
下的页面路径。
- 配置错误页路径,如下所示:
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/404").setViewName("/error/404.html");
}
}
在上述代码中,我们将/404
请求映射到/resources/static/error/404.html
页面。
自定义完Error Controller后,我们便可以通过访问http://localhost:8080/error
或http://localhost:8080/404
等来实现自定义错误提示页面的展示了。
方法二:使用ErrorPageRegistrar
除了自定义ErrorController之外,我们还可以通过使用ErrorPageRegistrar来实现自定义错误处理页面的功能,具体步骤如下:
- 创建一个类,实现
ErrorPageRegistrar
接口,如下所示:
@Configuration
public class MyErrorPageRegistrar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404"));
registry.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500"));
}
}
在该类中,我们通过ErrorPageRegistry.addErrorPages(ErrorPage ... var1)
方法,向SpringBoot注册了两个错误页。
- 配置404错误页路径,如下所示:
@Controller
public class MyErrorController {
@RequestMapping("/404")
public String handleError(HttpServletRequest request, HttpServletResponse response) {
// 这里处理自定义的404错误页面,比如获取Referer等信息,进行处理
return "/error/404.html";
}
}
和方法一相比,方法二方式的主要区别就是使用了ErrorPageRegistrar
来注册错误页,而不是自定义的ErrorController
。
需要注意的是,以上方法二需要在应用启动时先加载一下MyErrorPageRegistrar类:
@SpringBootApplication
@Import(MyErrorPageRegistrar.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
示例
为了更加直观地说明以上两种方法的使用,下面给出两条完整的示例说明:
示例一:自定义ErrorController
- 在
/resource/static/error
下新建一个文件404.html
,内容如下所示:
```
404 Not Found
Sorry, the page you are looking for is not found.
```
- 在SpringBoot应用中新建一个类
MyErrorController
,继承org.springframework.boot.web.servlet.error.ErrorController
,并重新实现getErrorPath
和handleError
方法,如下所示:
```
@Controller
public class MyErrorController implements ErrorController {
private final static String ERROR_PATH = "/error";
@RequestMapping(ERROR_PATH)
public String handleError(HttpServletRequest request, ModelMap modelMap) {
int statusCode = (int) request.getAttribute("javax.servlet.error.status_code");
Exception exception = (Exception) request.getAttribute("javax.servlet.error.exception");
// 这里处理自定义的error错误页面,比如获取statusCode、Exception等信息,进行处理
return "/error/404.html";
}
@Override
public String getErrorPath() {
return ERROR_PATH;
}
}
```
- 运行SpringBoot应用,通过浏览器访问不存在的URL,比如
http://localhost:8080/no_exist
,应该可以看到自定义的404错误页了。
示例二:使用ErrorPageRegistrar
-
在
/resource/static/error
下新建一个文件404.html
,内容同示例一。 -
在SpringBoot应用中新建一个类
MyErrorPageRegistrar
,实现ErrorPageRegistrar
接口,如下所示:
@Configuration
public class MyErrorPageRegistrar implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
registry.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/404"));
registry.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/500"));
}
}
- 在SpringBoot应用中新建一个类
MyErrorController
,用于处理自定义的404
错误页面,如下所示:
@Controller
public class MyErrorController {
@RequestMapping("/404")
public String handleError(HttpServletRequest request, HttpServletResponse response) {
// 这里处理自定义的404错误页面,比如获取Referer等信息,进行处理
return "/error/404.html";
}
}
- 运行SpringBoot应用,通过浏览器访问不存在的URL,比如
http://localhost:8080/no_exist
,应该也可以看到自定义的404错误页了。
以上就是完整的“SpringBoot自定义/error路径失效的解决”攻略,希望能对读者有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot自定义/error路径失效的解决 - Python技术站