【学习】若依源码(前后端分离版)之 “ 异常处理”

这篇具有很好参考价值的文章主要介绍了【学习】若依源码(前后端分离版)之 “ 异常处理”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

通常一个web框架中,有大量需要处理的异常。比如业务异常,权限不足等等。前端通过弹出提示信息的方式告诉用户出了什么错误。

通常情况下我们用try…catch…对异常进行捕捉处理,但是在实际项目中对业务模块进行异常捕捉,会造成代码重复和繁杂, 我们希望代码中只有业务相关的操作,所有的异常我们单独设立一个类来处理它。

全局异常就是对框架所有异常进行统一管理。若依前后端分离版本的异常处理是通过使用Spring的@RestControllerAdvice注解来实现的。这个注解可以将一个类标记为全局异常处理器,用来捕获和处理所有的控制器层抛出的异常。

它中定义了一个 GlobalExceptionHandler 类,用来处理各种类型的异常,比如权限校验异常、请求方式不支持异常、业务异常、运行时异常、系统异常、自定义验证异常和演示模式异常。每种异常都有一个对应的@ExceptionHandler注解的方法,用来返回一个AjaxResult对象,包含了错误码和错误信息。这样,前端就可以根据返回的结果来显示相应的提示或者处理逻辑。

所谓全局异常处理器就是使用@ControllerAdvice注解。示例如下:

1、统一返回实体定义

package com.ruoyi.common.core.domain;

import java.util.HashMap;

/**
 * 操作消息提醒
 * 
 * @author ruoyi
 */
public class AjaxResult extends HashMap<String, Object>
{
    private static final long serialVersionUID = 1L;

    /**
     * 返回错误消息
     * 
     * @param code 错误码
     * @param msg 内容
     * @return 错误消息
     */
    public static AjaxResult error(String msg)
    {
        AjaxResult json = new AjaxResult();
        json.put("msg", msg);
        json.put("code", 500);
        return json;
    }

    /**
     * 返回成功消息
     * 
     * @param msg 内容
     * @return 成功消息
     */
    public static AjaxResult success(String msg)
    {
        AjaxResult json = new AjaxResult();
        json.put("msg", msg);
        json.put("code", 0);
        return json;
    }
}

2、定义登录异常定义

package com.ruoyi.common.exception;

/**
 * 登录异常
 * 
 * @author ruoyi
 */
public class LoginException extends RuntimeException
{
    private static final long serialVersionUID = 1L;

    protected final String message;

    public LoginException(String message)
    {
        this.message = message;
    }

    @Override
    public String getMessage()
    {
        return message;
    }
}

3、基于@ControllerAdvice注解的Controller层的全局异常统一处理

package com.ruoyi.framework.web.exception;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.LoginException;

/**
 * 全局异常处理器
 * 
 * @author ruoyi
 */
@RestControllerAdvice
public class GlobalExceptionHandler
{
    private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class);
	
	/**
     * 登录异常
     */
    @ExceptionHandler(LoginException.class)
    public AjaxResult loginException(LoginException e)
    {
        log.error(e.getMessage(), e);
        return AjaxResult.error(e.getMessage());
    }
}

@RestControllerAdvice 注解是一个组合注解,由@ControllerAdvice@ResponseBody组成,而@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component,适用于所有使用@RequestMapping方法。

@ExceptionHandler 注解是用来指定异常处理方法的,当控制器中抛出指定类型的异常时,Spring MVC会自动调用使用@ExceptionHandler标记的方法来处理异常。每种异常都有一个对应的@ExceptionHandler注解的方法,是通过在@ExceptionHandler注解中添加参数来实现的,参数是某个异常类的class,代表这个方法专门处理该类异常。

这样,当控制器中抛出不同类型的异常时,就会调用相应的@ExceptionHandler注解的方法来处理。如果有多个方法处理同一类型的异常,那么会抛出Ambiguous @ExceptionHandler异常。

如果有多个类使用@RestControllerAdvice注解,那么可以通过指定order属性来控制异常处理类的优先级,order值越小,优先级越高。

4、测试访问请求

@Controller
public class SysIndexController 
{
    /**
     * 首页方法
     */
    @GetMapping("/index")
    public String index(ModelMap mmap)
    {
        /**
         * 模拟用户未登录,抛出业务逻辑异常
         */
        SysUser user = ShiroUtils.getSysUser();
        if (StringUtils.isNull(user))
		{
            throw new LoginException("用户未登录,无法访问请求。");
        }
		mmap.put("user", user);
        return "index";
    }
}

根据上面代码含义,当我们未登录访问/index时就会发生LoginException业务逻辑异常,按照我们之前的全局异常配置以及统一返回实体实例化,访问后会出现AjaxResult格式JSON数据, 下面我们运行项目访问查看效果。

界面输出内容如下所示:

{
    "msg": "用户未登录,无法访问请求。",
    "code": 500
}

对于一些特殊情况,如接口需要返回json,页面请求返回html可以使用如下方法:

@ExceptionHandler(LoginException.class)
public Object loginException(HttpServletRequest request, LoginException e)
{
	log.error(e.getMessage(), e);

	if (ServletUtils.isAjaxRequest(request))
	{
		return AjaxResult.error(e.getMessage());
	}
	else
	{
		return new ModelAndView("/error/500");
	}
}

若依系统的全局异常处理器为GlobalExceptionHandler

注意:如果全部异常处理返回json,那么可以使用@RestControllerAdvice代替@ControllerAdvice,这样在方法上就可以不需要添加@ResponseBody

结语

所以一定要养成看文档的好习惯啊。那么以上就是唐某的一些理解。这次的分享就到这里了。记得一键三连~( •̀ ω •́ )✧文章来源地址https://www.toymoban.com/news/detail-639806.html

到了这里,关于【学习】若依源码(前后端分离版)之 “ 异常处理”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 若依前后端分离版集成nacos

            根据公司要求,需要将项目集成到nacos中,当前项目是基于若依前后端分离版开发的,若依的版本为3.8.3,若依框架中整合的springBoot版本为2.5.14。Nacos核心提供两个功能:服务注册与发现,动态配置管理。 1、引入pom依赖 2、bootstrap.yml配置 3、添加注解 在项目启动类

    2023年04月12日
    浏览(38)
  • 【若依】框架:第01讲前后端分离项目

    介绍 | RuoYi         将下载好的若依项目导入IDEA,导入后配置MAVEN环境,等待下载完成。重点关注ruoyi-admin和ruoyi-system两个文件夹,前者放controller,后者放实体类、mapper、service ①打开文件夹选择若依前端项目(ruoyi-ui)文件夹 ②信任此作者进入 ③重点关心src文件夹下的api和

    2023年04月08日
    浏览(47)
  • 若依前端问题集合[前后端分离版本]

    目录 1.若依前后端分离页面改变title 1.修改icon 2.修改title文字 2.若依关闭Login页面验证码 1.关闭验证码 登录杂项 3.若依前端替换代理地址 4.侧边菜单和全局样式 1.侧边菜单 2.侧边栏顶部logo替换或删除 3.全局样式 修改背景色 修改浏览器title和icon图标 在项目 public 文件夹中有

    2024年02月07日
    浏览(54)
  • 若依项目的介绍(前后端分离版本)

    目录 一、若依介绍 (一)简单介绍  (二)若依版本 (三)Git远程拉取步骤  二、项目的技术介绍 (一)后端技术 1.spring boot 2.Spring Security安全控制 3.MyBatis 4.MySQL和Redis (二)前端技术 1.vue 2.vue-router 3.axios  4.element-ui 5.node 6.ES6 7.Nginx反向代理服务器 三、项目结构介绍 1.总体

    2024年02月12日
    浏览(45)
  • 从零入门开源框架---若依(前后端分离版)

    一、若依是什么? 若依它就是一个开源项目,别人写好的代码,我们拿来进行二次开发,它主要是做数据和权限管理系统。 二、使用背景 任何公司的各种大的项目必然需要一个后台权限管理系统,这是必然的,但是如果不想投入太多人力物力去开发,又恰好有现成且比较好用

    2024年02月02日
    浏览(38)
  • 四、若依(前后端分离)项目构建docker 镜像

    修改配置文件参数,数据库ip和账号密码 修改端口号,这个修改不修改都无所谓,docker run时端口映射时修改也可以的 redis ip和端口修改 输入目录 rz 上传

    2024年02月10日
    浏览(39)
  • 若依前后端分离版配置多数据源

    1、application.yml里面配置数据源 2、在common模块的enums目录下的DataSourceType增加数据枚举类型 3、在framework模块下的config目录下修改DruidConfig,照着自带的从库写法 4、然后用@DataSource注解来切换数据源,可以写在类上,也可以写在方法里面,还可以写覆盖mp的方法,来实现某个s

    2024年01月19日
    浏览(45)
  • 若依接口500异常,前端分离

    1.更改vue.config.js中 target的网址为` https://vue.ruoyi.vip `, [ process .env.VUE_APP_BASE_API]: { target: ` https://vue.ruoyi.vip `,} 2. pathRewrite单引号后加入 /prod-api pathRewrite: { [\\\'^\\\' + process .env.VUE_APP_BASE_API]: \\\'/prod-api\\\' 3.在.env.development中变更 VUE_APP_BASE_API = \\\'/prod-api\\\' 用了若依线上的网址,500错误,不能加

    2024年02月05日
    浏览(39)
  • 若依前后端分离项目在腾讯云的部署

    本文章使用了腾讯云提供的宝塔系统 在部署项目和配置环境的时候会相对其他方法更容易一些  购买腾讯云服务器 腾讯云11.11云上盛惠_腾讯云11.11优惠活动-腾讯云 (tencent.com)  我购买的是2核4g的服务器 之前听老师建议最好2核4g起步    购买的时候选择默认的宝塔系统就ok了不

    2024年02月06日
    浏览(46)
  • 用docker一键部署前后端分离若依系统

    目录 一、搭建局域网 1.1、介绍前后端项目搭建 1.2、操作 二、安装redis 测试 三、安装Mysql 检查 远程连接  注意:0- 1-工具原因,复制进去记得删除​编辑 工具测试 四、部署后端服务 4.1、创建数据库 4.2、使用Dockerfile自定义镜像 测试 测试 五、前端部署 5.1、nginx部署 分析n

    2024年03月16日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包