SpringBoot自定义/error路径失效的解决

下面是对于“SpringBoot自定义/error路径失效的解决”的完整攻略:

背景

在使用SpringBoot开发web应用的过程中,我们有时需要自定义error处理页面。按照惯例,我们可以将静态页面放在/resources/static/error路径下,然后在Controller层中自定义处理对应的erroCode,比如404、500等。这样,当用户访问出错时,SpringBoot便会自动跳转到对应的错误页面。

问题

但是,有时我们会发现自定义/error路径失效,比如在访问不存在的URL时,默认跳转到SpringBoot自带的错误提示页面,而不是我们自定义的页面。那么,我们该如何解决这个问题呢?下面给出两种解决方法。

方法一:自定义ErrorController

在SpringBoot中,如果我们需要自定义error处理的显示界面,我们可以通过自定义一个ErrorController来实现,这也是SpringBoot官方推荐的方式。

具体步骤如下:

  1. 创建一个类,继承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下的页面路径。

  1. 配置错误页路径,如下所示:

@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/errorhttp://localhost:8080/404等来实现自定义错误提示页面的展示了。

方法二:使用ErrorPageRegistrar

除了自定义ErrorController之外,我们还可以通过使用ErrorPageRegistrar来实现自定义错误处理页面的功能,具体步骤如下:

  1. 创建一个类,实现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注册了两个错误页。

  1. 配置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

  1. /resource/static/error下新建一个文件404.html,内容如下所示:

```




404 Not Found

404 Not Found

Sorry, the page you are looking for is not found.


```

  1. 在SpringBoot应用中新建一个类MyErrorController,继承org.springframework.boot.web.servlet.error.ErrorController,并重新实现getErrorPathhandleError方法,如下所示:

```
@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;
   }

}
```

  1. 运行SpringBoot应用,通过浏览器访问不存在的URL,比如http://localhost:8080/no_exist,应该可以看到自定义的404错误页了。

示例二:使用ErrorPageRegistrar

  1. /resource/static/error下新建一个文件404.html,内容同示例一。

  2. 在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"));
}
}

  1. 在SpringBoot应用中新建一个类MyErrorController,用于处理自定义的404错误页面,如下所示:

@Controller
public class MyErrorController {
@RequestMapping("/404")
public String handleError(HttpServletRequest request, HttpServletResponse response) {
// 这里处理自定义的404错误页面,比如获取Referer等信息,进行处理
return "/error/404.html";
}
}

  1. 运行SpringBoot应用,通过浏览器访问不存在的URL,比如http://localhost:8080/no_exist,应该也可以看到自定义的404错误页了。

以上就是完整的“SpringBoot自定义/error路径失效的解决”攻略,希望能对读者有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot自定义/error路径失效的解决 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Spring扩展BeanFactoryPostProcessor使用技巧详解

    首先需要明确的是,BeanFactoryPostProcessor是在Spring容器实例化Bean之后,在Bean实例化之前处理BeanFactory中的BeanDefinition的接口。 一、BeanFactoryPostProcessor的使用场景 通常,在开发中,我们会利用BeanFactoryPostProcessor来修改或扩展BeanDefi…

    Java 2023年5月31日
    00
  • 使用MybatisPlus自定义模版中能获取到的信息

    MybatisPlus(简称MP)是一个基于Mybatis的增强工具库,可以大大简化Mybatis开发,提高开发效率。MP支持使用自定义模版来生成代码,通过自定义模版可以快速生成符合公司业务规范的代码,而且MP在模版中提供了很多变量,方便我们在模版中使用。 下面详细讲解在MP自定义模板中能够获取到的信息及使用方法: 1. 可以获取表的元数据信息 在自定义模版…

    Java 2023年6月15日
    00
  • Java开发druid数据连接池maven方式简易配置流程示例

    如您所说,本人将为您提供Java开发druid数据连接池maven方式简易配置流程示例的完整攻略。 一、引入druid连接池的maven依赖 首先,在Java项目的pom.xml文件中引入druid连接池的maven依赖。示例如下: <dependency> <groupId>com.alibaba</groupId> &…

    Java 2023年5月20日
    00
  • Spring 5.0集成log4j2日志管理的示例代码

    下面详细讲解一下“Spring 5.0集成log4j2日志管理的示例代码”的完整攻略。 一、前置知识 在讲解Spring 5.0集成log4j2日志管理的示例代码前,需要了解一下以下基础知识: log4j2:是一个Java的日志框架,可以帮助Java开发者在应用程序中打印日志; Spring 5.0:是一个Java应用程序框架,可以帮助开发者创建Web应用程…

    Java 2023年5月19日
    00
  • Java中对象的序列化详解及实例

    Java中对象的序列化详解及实例攻略 什么是序列化 序列化是将对象转换为字节序列的过程,以便将其存储到文件或内存缓冲区中,也可以通过网络传输到另一个计算机中。反序列化则是从字节序列中重构对象的过程。 在Java中,序列化是通过实现Serializable接口来实现的。该接口中没有方法,只是用来指示该类是可序列化的。 序列化的作用 序列化在实际开发中非常有用。…

    Java 2023年5月26日
    00
  • 在Java中Scanner的用法总结

    请看下面的攻略。 在Java中Scanner的用法总结 简介 在Java中,Scanner类是一个非常常用的输入类,它可以扫描用户输入的各种数据类型(如整数、浮点数、字符串等)并以指定的格式输出。本文将详细介绍Scanner类的用法,帮助读者快速、准确地学会使用Scanner类。 常用方法 1. 实例化一个Scanner对象 import java.util…

    Java 2023年5月26日
    00
  • SpringBoot配置项目访问路径URL的根路径方式

    在Spring Boot应用程序中,我们可以使用配置文件或注解的方式来配置项目访问路径URL的根路径。本文将详细介绍如何使用这两种方式来配置项目访问路径URL的根路径,并提供两个示例说明。 1. 使用配置文件配置项目访问路径URL的根路径 在Spring Boot应用程序中,我们可以使用application.properties或application.y…

    Java 2023年5月18日
    00
  • Java的Spring框架下RMI与quartz的调用方法

    Java的Spring框架下RMI与quartz的调用方法主要分为以下几个步骤: 首先需要在pom.xml文件中添加相应的依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-rmi</artifactId&g…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部