SpringMVC中的异常处理机制详解
作者:乐其所乐
SpringMVC提供了基于xml和基于注解的异常处理机制,一般情况下两者都要进行配置,xml异常处理机制主要用于处理xml方式产生的异常,注解异常处理机制主要用于处理基于注解方式产生的异常,这篇文章主要介绍了SpringMVC中的异常处理机制,需要的朋友可以参考下
1. 概述
SpringMVC提供了基于xml和基于注解的异常处理机制,一般情况下两者都要进行配置,xml异常处理机制主要用于处理xml方式产生的异常,注解异常处理机制主要用于处理基于注解方式产生的异常。
2. 基于xml方式的异常处理机制
<!--配置基于xml的异常映射--> <bean id="simpleMappingExceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <!--key属性指定具体的出错类型,标签体中为对应的出错页面(这个值会拼上前后缀以得到全路径)--> <prop key="java.lang.Exception">system-error</prop> </props> </property> </bean>
3. 基于注解方式的异常处理
步骤:
- 使用@ControllerAdvice注解表名此类为异常处理类
- 方法上使用@ExceptionHandler注解表示此方法处理何种异常,如
@ExceptionHandler(value = ArithmeticException.class)
4. 实际应用
一般若是普通请求产生的异常,则应该返回错误页面,若是Ajax请求返回的是相应的JSON字符串。
判断一个请求是否是Ajax请求
请求依据:(两者含其一则为Ajax请求)
- 请求头中Accept中包含application/json
- 请求头中X-Requested-With字段为XMLHttpRequest的为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<Object> failed = ResultEntity.failed(exception.getMessage()); Gson gson = new Gson(); // 将ResultEntity对象转换为JSON字符串 String s = gson.toJson(failed); // 将JSON字符串作为响应体返回给浏览器 response.getWriter().write(s); return null; } // 如果是普通请求 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception); // 设置对应的视图名称 modelAndView.setViewName(viewName); return modelAndView; } }
注:ResultEntity对象为统一响应对象,其中的failed方法实际上是将传入的exception对象封装成一个ResultEntity对象并返回给调用者。CrowdConstant类为自定义的常量类,主要用于存储各种常用的字符串,可有效预防写错单词导致的程序错误,在实际开发中十分有用。
解释:若为Ajax请求,则应该向浏览器返回一个JSON字符串格式的ResultEntity对象,此时异常处理机制返回null即可;若为普通请求,则抛出异常,并返回异常页面(此时是页面名称,因为前后缀在mvc文件中已配置)。
到此这篇关于SpringMVC中的异常处理机制的文章就介绍到这了,更多相关SpringMVC异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!