汇总目录链接: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替换原来的AjaxExceptionHandler和MyExceptionHandler
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开发常用技术博客目录