SpringMVC提供了基于xml和基于注解的异常处理机制,一般情况下两者都要进行配置,xml异常处理机制主要用于处理xml方式产生的异常,注解异常处理机制主要用于处理基于注解方式产生的异常。
system-error
步骤:
一般若是普通请求产生的异常,则应该返回错误页面,若是Ajax请求返回的是相应的JSON字符串。
判断一个请求是否是Ajax请求
请求依据:(两者含其一则为Ajax请求)
/**
* 判断此次请求是否是Ajax请求
* @param request 此次请求对应的request对象
* @return true表示是Ajax请求,false表示是普通请求
*/
public static boolean isAjax(HttpServletRequest request) {
String accept = request.getHeader("Accept");
String xRequestHeader = request.getHeader("X-Requested-With");
return accept != null && accept.contains("application/json")
||
xRequestHeader != null && xRequestHeader.equals("XMLHttpRequest");
}
配置基于xml方式的异常处理机制
配置基于注解方式的异常处理
package com.wuw.crowd.mvc.config;
import com.google.gson.Gson;
import com.wuw.crowd.exception.LoginFailedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import com.wuw.crowd.util.CrowdUtil;
import com.wuw.crowd.constant.CrowdConstant;
import com.wuw.crowd.util.ResultEntity;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @description: 基于注解的异常处理机制
* @author: WuW
* @create: 2022/5/2 18:36
*/
@ControllerAdvice
public class MyExceptionResolver {
@ExceptionHandler(value = ArithmeticException.class)
public ModelAndView resolveArithmeticException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
String viewName = "system-error";
return commonResolve(viewName, exception, request, response);
}
@ExceptionHandler(value = NullPointerException.class)
public ModelAndView resolveNullPointerException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
String viewName = "system-error";
return commonResolve(viewName, exception, request, response);
}
@ExceptionHandler(value = LoginFailedException.class)
public ModelAndView resolveLoginFailedException(HttpServletRequest request, HttpServletResponse response, LoginFailedException exception) throws IOException {
String viewName = "admin-login";
return commonResolve(viewName, exception, request, response);
}
/**
* 抽取异常处理机制的公共部分
* @param viewName 将要返回到哪个页面
* @param exception 捕获到的异常信息
* @param request 请求对象
* @param response 响应对象
* @return 返回ModelAndView
* @throws IOException 响应对象获取输出流时抛出异常
*/
private ModelAndView commonResolve(String viewName, Exception exception, HttpServletRequest request, HttpServletResponse response) throws IOException {
boolean ajax = CrowdUtil.isAjax(request);
// 如果是Ajax请求
if (ajax) {
// 创建ResultEntity对象
ResultEntity
注:ResultEntity对象为统一响应对象,其中的failed方法实际上是将传入的exception对象封装成一个ResultEntity对象并返回给调用者。CrowdConstant类为自定义的常量类,主要用于存储各种常用的字符串,可有效预防写错单词导致的程序错误,在实际开发中十分有用。
解释:若为Ajax请求,则应该向浏览器返回一个JSON字符串格式的ResultEntity对象,此时异常处理机制返回null即可;若为普通请求,则抛出异常,并返回异常页面(此时是页面名称,因为前后缀在mvc文件中已配置)。
参与评论
手机查看
返回顶部