SpringMVC统一异常处理(返回异常数据而不是跳转到某个页面的方法)

2023-05-16

关于SpringMVC统一异常处理的问题,网搜一大把。网上搜的关于如何进行统一异常处理不外乎如下三种方式:

Spring MVC处理异常有3种方式:
(1) 使用Spring MVC提供的简单异常处理器SimpleMappingExceptionResolver;
(2) 实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器;
(3) 使用@ExceptionHandler注解实现异常处理;

然而,大家都在介绍异常发生的时候如何跳转到一个特定的页面。如何在跳转到的页面呈现异常信息等等。

然而,上述处理方式对于我的需求并没有什么卵用。我想要的结果是在发生异常之后,不是调转到某个页面,而是将异常信息以数据的形式(比如json数据)返回。

不过本人不才,目前仅仅发现使用ExceptionHandler注解实现统一异常处理的方式,也是可以返回异常信息而不是跳转到某个页面呈现异常信息的。大家有新的发现不妨告诉我咯。统一异常处理的好处我就不说了,能够将异常信息统一捕捉并组装成固定格式的数据返回的好处,我想在ajax回调处理中好处可多了, 回调得到的数据因为格式统一,前端可以很方便的通过某种控件进行呈现或友好提示 。 虽然我们也可以手动在Controller层的方法返回的结果中添加异常信息,但是只会徒增代码量,却不能使我们更好的专注于业务逻辑。

解决办法如下:
1、增加BaseExceptionHandleAction类,并在类中同时使用@ExceptionHandler和@ResponseBody注解声明异常处理,代码如下:


import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import com.core.exception.BusinessException;
import com.core.util.JsonUtil;

public class BaseExceptionHandleAction {

    protected HttpServletRequest getServletRequest() {
        return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
    }

    protected ServletContext getServletContext() {
        HttpServletRequest request = getServletRequest();
        if (request != null) {
            return request.getSession().getServletContext();
        }

        return null;
    }

    protected HttpServletResponse getServletResponse() {
        return RequestResponseContext.getResponse();
    }

    protected void writeResponse(ActionResult result) throws IOException {
        HttpServletResponse response = getServletResponse();
        response.setContentType("text/html; charset=utf-8");
        OutputStream stream = response.getOutputStream();
        stream.write(JsonUtil.toJson(result).getBytes("utf-8"));
        stream.flush();
        stream.close();
    }

    /** 基于@ExceptionHandler异常处理 */
    /*@ExceptionHandler
    public ModelAndView  handleAndReturnPage(HttpServletRequest request, HttpServletResponse response, Exception ex) {

        ModelAndView  mv = new ModelAndView("Exception") ;
        mv.addObject("ex", ex);

        // 根据不同错误转向不同页面
        if (ex instanceof BusinessException) {
            return mv;
        } else {
            return mv; //返回Exception.jsp页面
        }
    }*/

    /** 基于@ExceptionHandler异常处理 */
    @ExceptionHandler
    @ResponseBody
    public Map<String, Object>  handleAndReturnData(HttpServletRequest request, HttpServletResponse response, Exception ex) {

        Map<String, Object> data = new HashMap<String, Object>();
        if(ex instanceof BusinessException) {
            BusinessException e = (BusinessException)ex;
            data.put("code", e.getCode());
        }
        data.put("msg", ex.getMessage());
        data.put("excetion", ex.getClass().getSimpleName());
        return data;
    }

}

2、修改代码,使所有需要异常处理的Controller都继承该类,如下所示,修改后的ExceptionTestController类继承于BaseExceptionHandleAction:


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.core.exception.BusinessException;
import com.core.springmvc.BaseExceptionHandleAction;

@Controller
public class ExceptionTestController extends BaseExceptionHandleAction {

    // http://localhost:8080/SSM/exceptionTest?id=10
    @RequestMapping(value = "/exceptionTest", method = RequestMethod.GET)
    public void controller(HttpServletRequest request, HttpServletResponse response, Integer id) {
        if (id == 10) {
            throw new BusinessException(10, "该异常代表用户信息不完整");

        } else if (id == 20) {
            throw new BusinessException(20, "该异常代表用户信息泄露");

        } else {
            throw new BusinessException(30, "该异常代表用户不存在");
        }
    }

}

3、本人的BusinessException类的代码如下


public class BusinessException extends RuntimeException {

    /**
     */
    private static final long serialVersionUID = -7638041501183925225L;

    private Integer code;

    public BusinessException(Integer code, String msg) {
        super(msg);
        this.code = code;
    }

    public BusinessException(Integer code, String msg, Throwable cause) {
        super(msg, cause);
        code = code;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }




}

4、启动测试项目,本人项目名称为SSM,通过访问路径http://localhost:8080/SSM/exceptionTest?id=20,得到的结果如下:

{
“msg “:” 该异常代表用户信息泄露”,
“code” : 20,
“excetion” : “BusinessException”
}

5、至此,需求完美解决。只需要@ExceptionHandler和@ResponseBody两个注解同时使用即可完美解决需求。注意:我的BaseExceptionHandleAction类中还有一个注释了的方法,该方法仅仅使用了注解@ExceptionHandler,所以该注释了的方法可以在发生异常时候跳转到某个指定页面。但是注意,这两个方法不能同时存在,否则spring MVC不知道异常发生时该使用哪个方法来处理异常。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringMVC统一异常处理(返回异常数据而不是跳转到某个页面的方法) 的相关文章

随机推荐

  • 【论文阅读】Cancelable Iris Biometric

    1 介绍 如果同时使用密钥和虹膜生物测定 xff0c 则错误拒绝率将增加 xff0c 因为恢复的密钥和汉明匹配距离都受到来自虹膜图案的噪声的影响 2 方法论 2 1 免注册转换 xff08 Registration free transfo
  • 阿里云服务器VNC连接Timed out waiting for a response from the computer报错解决方案

    首先要说明一点 xff0c 如果你是初学者 xff0c 第一次使用阿里云服务器并想获得可视化界面过程中遇到连接问题 xff0c 你可以参考以下方案 因为想要处理网页自动化测试的同时查看效果 xff0c 所以我想搞个VNC Viewer来显示
  • 发现scikit-image

    我是图形方面的新手 xff0c 写错的地方还请大家勘正 不记得从哪看到openCV与python的东西 xff0c 突然产生兴趣 xff0c 我喜欢python3 xff0c 但openCV偏偏最高只有python 2 7的支持 openC
  • Jetpack的学习

    一 ViewModel ViewModel的一个重要作用就是帮助Activity分担一部分的工作 xff0c 专门存放关于界面相关的数据 只要界面上能看到的数据 xff0c 都应该存放到ViewModel中 另外一个很重要的特性就是当手机屏
  • 【centOS 7一个解决“network.service: control process exited, code=exited status=1”方法】

    当我们用finalshell时 xff0c 发现连接不上 xff0c 用ip addr查看时 xff0c ens33没有ip xff0c 查看日志 一开始以为是没有开始网卡 xff0c 于是进入修改网卡配置参数 xff0c 修改 ONBOO
  • Ubuntu 20.04桌面文件夹图标消失及文件系统无法打开

    前言 之前遇到过服务器上桌面图标突然消失的情况 在更换系统语言之后 xff0c 桌面出现过一次这种情况 xff0c 经过重启之后就恢复了 再后来又莫名其妙出现了这么个问题 xff0c 最开始搜索的解决方案是 让你打开任务管理器 gnome
  • vim打造最强systemverilog编辑器

    更多分享内容可访问我的个人博客 https www niuiic top 更新 xff1a 1 对自动补全部分进行加强 xff0c 可以无限自定义snippets和keywords 补全能力完胜vscode 2 使用svlangserver
  • 修改CentOS VNC分辨率

    修改VNC分辨率有两个地方 1 etc sysconfig vncservers 2 usr bin vncserver 有些机器直接设置了这里就行 xff0c 有些要通过设置2才行
  • Debian11系统安装与配置Elasticsearch7.17.6

    安装方式 xff1a 使用安装包进行离线安装 1 下载安装包 下载地址 xff1a Elasticsearch 7 17 6 Elastic 选择DEB X86 64 xff0c 下载后得到文件elasticsearch 7 17 6 am
  • Windows Server 2012 R2 管理员密码忘记如何修改密码

    管理员密码忘记如何修改 人非圣贤孰能无过 有时我们经常会遇到忘记密码的尴尬场景 尤其是本机的管理员密码忘记 xff0c 那么如何更改恢复呢 xff1f xff08 如果你安装系统的过程中本身没有设置过密码 xff0c 那密码就为空或者为Ad
  • XPath 简单语法 (三)

    XPath表达式 2008 02 27 16 55 XML 文档对象模型 DOM 能够以编程方式读取 处理和修改 XML 文档 XPath 表达式 XPath 表达式使用路径表示法 xff08 与 URL 中使用的路径表示法类似 xff09
  • Error: cannot open display: localhost:0.0

    https stackoverflow com questions 12356425 error cannot open display localhost0 0 trying to open firefox from centos 6 在
  • MySQL 5.6 源码目录结构

    基于MySQL 5 6 26源码 源码目录 xff1a BUILD 构建工程的脚本 client 客户端 cmake cmd line utils 命令行工具 dbug 调试库 Docs 文档 extra 一些相对独立的次要工具 inclu
  • 计算机I/O原理

    cpu通过IO命令控制设备 xff0c cpu对设备的控制仅仅可以到达设备控制器 xff0c 无法直接控制设备 设备无法直接和cpu通信 xff0c 设备控制器通过中断机制向cpu反馈信息 即这个一个模型 CPU IO指令 gt 设备控制器
  • 计算机的I/O端口地址表

    PC的I O端口地址表 xff08 I O端口地址表 xff09 http tieba baidu com f kz 61 16042340 I O端口地址表 PC只用了10位地址线 A0 A9 进行译码 xff0c 其寻址的范围为0H 3
  • 利用pthread进行数组求和

    POSIX thread 简称为pthread xff0c Posix线程是一个 POSIX 标准线程 利用多线程可以提高运算速度 利用pthread进行数组求和的程序如下 xff1a include lt stdio h gt inclu
  • 字符串的全排列程序

    include lt iostream gt include lt cstring gt using namespace std void swap char str int i int j char tmp 61 str i str i
  • Google面试总结

    分享 Google面试总结 来源 xff1a 王冠中的日志 终于把Google的面试给搞完了 xff0c 感觉可以算是Tech Interview的顶峰了 这里主要写一下大概流程和内容 xff0c 给大家以后interview一个参考 G的
  • sql server中的注释快捷键

    sql server中的注释快捷键 注释 xff1a Ctrl 43 K Ctrl 43 C xff08 按住Ctrl 然后K C xff09 取消注释 xff1a Ctrl 43 K Ctrl 43 U xff08 按住Ctrl 然后K
  • SpringMVC统一异常处理(返回异常数据而不是跳转到某个页面的方法)

    关于SpringMVC统一异常处理的问题 xff0c 网搜一大把 网上搜的关于如何进行统一异常处理不外乎如下三种方式 xff1a Spring MVC处理异常有3种方式 xff1a 1 使用Spring MVC提供的简单异常处理器Simpl