SpringMVC中的异常处理机制详解

 更新时间:2024年05月17日 15:21:12   作者:乐其所乐  
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异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 实例讲述Java IO文件复制

    实例讲述Java IO文件复制

    本篇文章通过实例给大家详细讲述Java IO文件复制的相关知识点,需要的读者们学习下吧。
    2018-02-02
  • SpringBoot使用Redis实现分布式锁

    SpringBoot使用Redis实现分布式锁

    这篇文章主要为大家详细介绍了SpringBoot使用Redis实现分布式锁,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • Java图片上传实现代码

    Java图片上传实现代码

    这篇文章主要为大家详细介绍了Java图片上传实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Java实现阿里云短信接口的示例

    Java实现阿里云短信接口的示例

    这篇文章主要介绍了Java实现阿里云短信接口的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • MyBatis使用annonation定义类型映射的简易用法示例

    MyBatis使用annonation定义类型映射的简易用法示例

    这篇文章主要介绍了MyBatis使用annonation定义类型映射的简易用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java多线程同步工具类CyclicBarrier的使用

    Java多线程同步工具类CyclicBarrier的使用

    本文主要介绍了Java多线程同步工具类CyclicBarrier的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • 详解Spring bean的注解注入之@Autowired的原理及使用

    详解Spring bean的注解注入之@Autowired的原理及使用

    之前讲过bean注入是什么,也使用了xml的配置文件进行bean注入,这也是Spring的最原始的注入方式(xml注入).本文主要讲解的注解有以下几个:@Autowired、 @Service、@Repository、@Controller 、@Component、@Bean、@Configuration、@Resource ,需要的朋友可以参考下
    2021-06-06
  • Spring中容器的创建流程详细解读

    Spring中容器的创建流程详细解读

    这篇文章主要介绍了Spring中容器的创建流程详细解读,Spring 框架其本质是作为一个容器,提供给应用程序需要的对象,了解容器的诞生过程,有助于我们理解 Spring 框架,也便于我们“插手”这个过程,需要的朋友可以参考下
    2023-10-10
  • Java设计模式之观察者模式(Observer Pattern)详解

    Java设计模式之观察者模式(Observer Pattern)详解

    观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都能够自动地得到通知并进行更新,本文将详细的给大家介绍一下Java观察者模式,需要的朋友可以参考下
    2023-07-07
  • Java编译时类型与运行时类型

    Java编译时类型与运行时类型

    这篇文章主要介绍了Java编译时类型与运行时类型,文章以父类BaseClass和子类SubClass为例展开对主题的探讨,具有一的 参考价值,需要的小伙伴可以参考一下
    2022-03-03

最新评论