SpringBoot-グローバル例外キャプチャを構成します

サマリーディレクトリリンク: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は、元の置き換えAjaxExceptionHandlerMyExceptionHandlerを

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開発の共通テクノロジブログディレクトリ

おすすめ

転載: blog.csdn.net/qq_33369215/article/details/90412391