在Spring Boot中自定义错误页面可以让应用程序在遇到特定HTTP错误状态码时,向用户展示更加友好和定制化的错误信息页面。
以下是几种常见的方法来实现这一功能:
1. 静态资源文件夹下的错误页面
Spring Boot默认会从src/main/resources/static/error或src/main/resources/public/error目录下查找错误页面。
需要按照HTTP状态码命名这些错误页面,例如,为了自定义404错误页面,可以创建一个名为404.html的文件在这个目录下。
2. 使用ErrorController
创建一个类实现ErrorController接口,覆盖其getErrorPath方法,并定义一个处理方法来返回自定义错误视图。
例如:
java
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.RequestDispatcher;
import javax.servlet.http.HttpServletRequest;
@Controller
public class CustomErrorController implements ErrorController {
@RequestMapping("/error")
public String handleError(HttpServletRequest request) {
Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if (status != null) {
Integer statusCode = Integer.valueOf(status.toString());
if (statusCode == HttpStatus.NOT_FOUND.value()) {
return "error/404"; // 假设有在templates目录下的error/404.html
} else if (statusCode == HttpStatus.INTERNAL_SERVER_ERROR.value()) {
return "error/500"; // 同上,对应500错误页面
}
// 可以添加更多错误处理逻辑
}
return "error/default"; // 默认错误页面
}
@Override
public String getErrorPath() {
return "/error";
}
}
3. 使用@ExceptionHandler注解
在控制器类中,可以使用@ExceptionHandler注解来处理特定的异常,并返回自定义的视图。这种方式适用于处理特定业务异常。
java
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(value = {NotFoundException.class})
public ModelAndView handleNotFoundException(Exception e) {
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("errorMessage", e.getMessage());
modelAndView.setViewName("error/404"); // 对应的错误页面
return modelAndView;
}
}
4. 配置Whitelabel Error Page
如果不希望使用Spring Boot默认的白色标签错误页面,可以在application.properties或application.yml中关闭它:
XML
spring.mvc.throw-exception-if-no-handler-found=true
spring.resources.add-mappings=false
server.error.whitelabel.enabled=false