サマリーディレクトリリンク:SpringBoot開発の共通テクノロジブログディレクトリ
この記事では、単純なグローバル例外キャプチャを構成するだけです。必要に応じて、実際の状況に応じて他の例外やカスタム例外を開発できます。
ウェブページジャンプ
プロジェクトの構成は次のとおりです。
MyExceptionHandler.java
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class MyExceptionHandler {
private static final String MY_ERROR_VIEW = "error";
@ExceptionHandler(value = Exception.class)
public Object errorHandler(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
e.printStackTrace();
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", request.getRequestURL());
mav.setViewName(MY_ERROR_VIEW);
return mav;
}
}
error.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>错误页面</title>
</head>
<body>
<h1 style="color: red">发生错误:</h1>
<div th:text="${url}"></div>
<div th:text="${exception.message}"></div>
</body>
</html>
例外テストクラスErrorController.java
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* 异常测试类
*/
@Controller
@RequestMapping(value = "err")
public class ErrorController {
@RequestMapping(value = "/error")
String error() {
int a = 1 / 0;
return "aaa";
}
}
実行効果:
Ajaxフォーム
ErrorController.java
@Controller
@RequestMapping(value = "err")
public class ErrorController {
@RequestMapping(value = "/getAjaxPage")
String getAjaxPage() {
return "ajaxpage";
}
@RequestMapping(value = "/getAjaxerror")
@ResponseBody
Result getAjaxerror() {
System.out.println(1/0);
return Result.ok("ok");
}
}
AjaxExceptionHandler.java(MyEcxceptionHandler.javaで@ControllerAdviceと@ExceptionHandlerをコメントアウトし、AjaxExceptionHandler.javaを使用する場合は、MyEcxceptionHandler.javaで@RestControllerAdviceと@ExceptionHandlerをコメントアウトします)注:
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.xiangty.common.Result;
@RestControllerAdvice
public class AjaxExceptionHandler {
@ExceptionHandler(value = Exception.class)
public Result errorHandler(HttpServletRequest request, HttpServletResponse response,Exception e) throws Exception {
e.printStackTrace();
return Result.error(e.getMessage());
}
}
JSとajaxpage.htmlフロントエンドコンテンツを追加します
ajaxpage.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>Ajax页面</title>
<script src="../static/js/jquery-3.3.1.js"></script>
</head>
<body>
<input type="button" value="点击发送ajax请求" onclick="query()"/>
<br>
<div id="context"></div>
<script>
function query() {
$.ajax({
url: "/err/getAjaxerror",
type: "POST",
async: false,
success: function (response) {
console.info(response);
if (response.status == 10000) {
$("#context").text("成功");
} else {
$("#context").text("失败,错误信息:"+response.data);
}
},
error: function(response){
$("#context").text("失败,错误信息:"+response.data);
}
});
}
</script>
</body>
</html>
WebConfig.javaを追加します(追加しない場合、htmlがjsを参照するときに404例外が報告されます)
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//将所有/static/** 访问都映射到classpath:/static/ 目录下
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
}
ページをクリックしてajaxリクエストを送信します
WebページジャンプとAjax形式の互換性
CommonExceptionHandler.javaは、元の置き換えAjaxExceptionHandlerとMyExceptionHandlerを
CommonExceptionHandler.javaで、リクエストコンテンツのコンテンツがAjaxの形式であるかどうかを判断し、上記の2つのパス検証モードを使用します。
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import com.xiangty.common.Result;
@RestControllerAdvice
public class CommonExceptionHandler {
private static final String MY_ERROR_VIEW = "error";
@ExceptionHandler(value = Exception.class)
public Object errorHandler(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
e.printStackTrace();
if(request.getHeader("X-Requested-With") != null
&& "XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
// Ajax形式
return Result.error(e.getMessage());
} else {
// web页面跳转
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", request.getRequestURL());
mav.setViewName(MY_ERROR_VIEW);
return mav;
}
}
}
サマリーディレクトリリンク:SpringBoot開発の共通テクノロジブログディレクトリ