Spring Boot-配置全局的异常捕获

汇总目录链接:Spring Boot开发常用技术博客目录

本文只是配置一个简单的全局的异常捕获,如有需要可以根据实际情况开发其它异常和自定义的异常。

web页面跳转

项目结构如下:

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形式,然后在用上述的两种模式的路径验证即可

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

}

汇总目录链接:Spring Boot开发常用技术博客目录

猜你喜欢

转载自blog.csdn.net/qq_33369215/article/details/90412391