SpringMVC中的异常处理机制

打印 上一主题 下一主题

主题 918|帖子 918|积分 2754

1. 概述

SpringMVC提供了基于xml和基于注解的异常处理机制,一般情况下两者都要进行配置,xml异常处理机制主要用于处理xml方式产生的异常,注解异常处理机制主要用于处理基于注解方式产生的异常。
2. 基于xml方式的异常处理机制
  1.     <bean id="simpleMappingExceptionResolver" >
  2.         <property name="exceptionMappings">
  3.             <props>
  4.                
  5.                 <prop key="java.lang.Exception">system-error</prop>
  6.             </props>
  7.         </property>
  8.     </bean>
复制代码
3. 基于注解方式的异常处理

步调:

  • 使用@ControllerAdvice注解表名此类为异常处理类
  • 方法上使用@ExceptionHandler注解表示此方法处理何种异常,如
    @ExceptionHandler(value = ArithmeticException.class)
4. 现实应用

一般假如普通请求产生的异常,则应该返回错误页面,假如Ajax请求返回的是相应的JSON字符串。

  • 判断一个请求是否是Ajax请求
    请求依据:(两者含其一则为Ajax请求)

    • 请求头中Accept中包含application/json
    • 请求头中X-Requested-With字段为XMLHttpRequest的为Ajax请求
    1. /**
    2.      * 判断此次请求是否是Ajax请求
    3.      * @param request 此次请求对应的request对象
    4.      * @return true表示是Ajax请求,false表示是普通请求
    5.      */
    6.     public static boolean isAjax(HttpServletRequest request) {
    7.         
    8.         String accept = request.getHeader("Accept");
    9.         String xRequestHeader = request.getHeader("X-Requested-With");
    10.         return accept != null && accept.contains("application/json")
    11.                 ||
    12.                 xRequestHeader != null && xRequestHeader.equals("XMLHttpRequest");
    13.     }
    复制代码
  • 配置基于xml方式的异常处理机制
  • 配置基于注解方式的异常处理
    1. package com.wuw.crowd.mvc.config;
    2. import com.google.gson.Gson;
    3. import com.wuw.crowd.exception.LoginFailedException;
    4. import org.springframework.web.bind.annotation.ControllerAdvice;
    5. import org.springframework.web.bind.annotation.ExceptionHandler;
    6. import org.springframework.web.servlet.ModelAndView;
    7. import com.wuw.crowd.util.CrowdUtil;
    8. import com.wuw.crowd.constant.CrowdConstant;
    9. import com.wuw.crowd.util.ResultEntity;
    10. import javax.servlet.http.HttpServletRequest;
    11. import javax.servlet.http.HttpServletResponse;
    12. import java.io.IOException;
    13. /**
    14. * @description: 基于注解的异常处理机制
    15. * @author: WuW
    16. * @create: 2022/5/2 18:36
    17. */
    18. @ControllerAdvice
    19. public class MyExceptionResolver {
    20.     @ExceptionHandler(value = ArithmeticException.class)
    21.     public ModelAndView resolveArithmeticException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
    22.         String viewName = "system-error";
    23.         return commonResolve(viewName, exception, request, response);
    24.     }
    25.     @ExceptionHandler(value = NullPointerException.class)
    26.     public ModelAndView resolveNullPointerException(HttpServletRequest request, HttpServletResponse response, NullPointerException exception) throws IOException {
    27.         String viewName = "system-error";
    28.         return commonResolve(viewName, exception, request, response);
    29.     }
    30.     @ExceptionHandler(value = LoginFailedException.class)
    31.     public ModelAndView resolveLoginFailedException(HttpServletRequest request, HttpServletResponse response, LoginFailedException exception) throws IOException {
    32.         String viewName = "admin-login";
    33.         return commonResolve(viewName, exception, request, response);
    34.     }
    35.     /**
    36.      * 抽取异常处理机制的公共部分
    37.      * @param viewName 将要返回到哪个页面
    38.      * @param exception 捕获到的异常信息
    39.      * @param request 请求对象
    40.      * @param response 响应对象
    41.      * @return 返回ModelAndView
    42.      * @throws IOException 响应对象获取输出流时抛出异常
    43.      */
    44.     private ModelAndView commonResolve(String viewName, Exception exception, HttpServletRequest request, HttpServletResponse response) throws IOException {
    45.         boolean ajax = CrowdUtil.isAjax(request);
    46.         // 如果是Ajax请求
    47.         if (ajax) {
    48.             // 创建ResultEntity对象
    49.             ResultEntity<Object> failed = ResultEntity.failed(exception.getMessage());
    50.             Gson gson = new Gson();
    51.             // 将ResultEntity对象转换为JSON字符串
    52.             String s = gson.toJson(failed);
    53.             // 将JSON字符串作为响应体返回给浏览器
    54.             response.getWriter().write(s);
    55.             return null;
    56.         }
    57.         // 如果是普通请求
    58.         ModelAndView modelAndView = new ModelAndView();
    59.         modelAndView.addObject(CrowdConstant.ATTR_NAME_EXCEPTION, exception);
    60.         // 设置对应的视图名称
    61.         modelAndView.setViewName(viewName);
    62.         return modelAndView;
    63.     }
    64. }
    复制代码
    注:ResultEntity对象为同一相应对象,其中的failed方法现实上是将传入的exception对象封装成一个ResultEntity对象并返回给调用者。CrowdConstant类为自界说的常量类,主要用于存储各种常用的字符串,可有用防备写错单词导致的步伐错误,在现实开发中十分有用。
    解释:若为Ajax请求,则应该向浏览器返回一个JSON字符串格式的ResultEntity对象,此时异常处理机制返回null即可;若为普通请求,则抛出异常,并返回异常页面(此时是页面名称,因为前后缀在mvc文件中已配置)。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

自由的羽毛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表