SpringBoot有預設的錯誤頁面處理
要實現這個我們首先可以在resource>templates>error的資料夾下
加入兩個頁面500.html , 404.html
並在resource>templates下面放index.html
然後造一個controller
@Controller
public class IndexController {
@GetMapping("/")
public String index(){
int i = 9/0;
return "index";
}
}
由於9/0會報錯
畫面就會自動導到命名為500的頁面
將報錯的那一行註解掉
我們在Build中點Recompile
然後刷新頁面
畫面就會來到首頁了
而當我們的URL打一個沒有資源的
ex http://127.0.0.1:8081/123456
他就會導到404的頁面
------------------------------------------------
而~如果我們要使用錯誤頁面, 並用其來顯示錯誤訊息, 可以以下搭配
1 先在error資料夾下產生一個error.xml檔案如下
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<html lang="en">
<head>
<meta charset="UTF-8">
<title>錯誤</title>
</head>
<body>
<h1>錯誤</h1>
<div>
<div th:utext="'<!--'" th:remove="tag"></div>
<div th:utext="'Failed Request URL : ' + ${url}" th:remove="tag"></div>
<div th:utext="'Exception message : ' + ${exception.message}" th:remove="tag"></div>
<ul th:remove="tag">
<li th:each="st : ${exception.stackTrace}" th:remove="tag"><span th:utext="${st}" th:remove="tag"></span></li>
</ul>
<div th:utext="'-->'" th:remove="tag"></div>
</div>
</body>
</html>
2產生一個掛@ControllerAdvice的類別
他主要用法是一個搭配ExceptionHandler攔截Exception的一個功能
下列程式碼, 基本上攔截後, 如果他有掛ResponseStatus類別的話, 他會繼續throw e
而如果沒有掛ResponseStatus就會回傳一個ModelAndView物件並導到error頁面
@ControllerAdvice
public class ControllerExceptionHandler {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@ExceptionHandler(Exception.class)
public ModelAndView exceptionHandler(HttpServletRequest request, Exception e) throws Exception {
logger.error("Request URL : {}, Exception : {}",request.getRequestURL(),e);
if(AnnotationUtils.findAnnotation(e.getClass(), ResponseStatus.class)!=null){
throw e;
}
ModelAndView mv= new ModelAndView();
mv.addObject("url",request.getRequestURL());
mv.addObject("exception",e);
mv.setViewName("error/error");
return mv;
}
}
而, 如果我們想要做出對應404的Exception
1 產生一個個性化的Exception類別並掛上ResponseStatus
@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException{
public NotFoundException() {
}
public NotFoundException(String message) {
super(message);
}
public NotFoundException(String message, Throwable cause) {
super(message, cause);
}
}
2在indexController中加入以下這段
String blog=null;
if(blog==null){
throw new NotFoundException("博客不存在");
}
因為剛剛已經在ControllerExceptionHandler中設置要繼續拋出e了
他就會跳轉到404的頁面