前后端分离项目处理异常最佳实践方法推荐(vue, Java)

SpringBoot+vue前后端分离博客项目 SpringBoot+vue前后端分离博客项目 后端项目交作业了!!! 阅读详情

如何处理异常是项目中极为头痛的一件事,尤其是在前后端分离的项目中,Exception必须作为Restful来处理,这里包括如何避免处理Exception的代码分散在项目代码,这样对于异常处理的重构和多语言支持都会造成很大的麻烦;还包括如何正确定义异常信息,使得用户所看到的错误提示信息是有效的,而不是一些数据库的error-code, 或者是500的HTTP STATUS。

当异常能够作为JSON成功传递到前端,这时又涉及到前端代码如何解析异常,将异常所包含的信息显示给用户,下面就给出后端Java的异常生成和传递,以及前端VUE接收到异常后处理方法。

我们要实现的结果是前端接收到如下JSON消息,并把消息的内容显示给用户

{"exception":"DuplicatedUserException","error":"Conflict","message":"admin 已经被占用. ","status":409,"errors":null}

从消息内容可以看出这是一个提示用户将要注册的用户名已经被占用,HttpStatus_Conflict: 409, 异常是用户自定义的DuplicatedUserException.

后端Java代码:

定义一个抽象类包含ErrorResponse的生成,将来其他每一个自定义异常都对应的Handler都会继承这个抽象类, 

import java.util.Collection;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.http.HttpStatus;

import com.lims.api.exception.ErrorResponse;

/**
 * Extend this to code an exception handler
 */
public abstract class AbstractExceptionHandler<T extends Throwable> {
	
	protected final Log log = LogFactory.getLog(this.getClass());
	
	private String exceptionName;
	
	public AbstractExceptionHandler(String exceptionName) {
		this.exceptionName = exceptionName;
	}

	public String getExceptionName() {
		return exceptionName;
	}
	
	protected String getMessage(T ex) {
		return ex.getMessage();
	}
	
	protected HttpStatus getStatus(T ex) {
		return null;
	}
	
	protected Collection<FieldError> getErrors(T ex) {
		return null;
	}

	public ErrorResponse getErrorResponse(T ex) {
		
		ErrorResponse errorResponse = new ErrorResponse();
		
		String message = getMessage(ex);
		if (message != null)
			errorResponse.setMessage(message);
		
		HttpStatus status = getStatus(ex);
		if (status != null) {
			errorResponse.setStatus(status.value());
			errorResponse.setError(status.getReasonPhrase());
		}
		
		errorResponse.setErrors(getErrors(ex));
		
		return errorResponse;
	}
}

自定义异常类:DuplicatedUserException, 异常的消息通过property文件给定,便于消息内容更改和多语言支持

import org.springframework.http.HttpStatus;

import com.lims.api.util.LimsUtils;

public class DuplicatedUserException extends RuntimeException {

	/**
	 * 
	 */
	private static final long serialVersionUID = -21168497361531088L;
	// HTTP Status code to be returned
	private HttpStatus status = HttpStatus.BAD_REQUEST;

	public DuplicatedUserException(String userName) {
		super(LimsUtils.getMessage("com.lims.api.exception.DuplicatedUserException", userName));
	}

	public HttpStatus getStatus() {
		return status;
	}

	public void setStatus(HttpStatus status) {
		this.status = status;
	}

	public DuplicatedUserException httpStatus(HttpStatus status) {
		this.status = status;
		return this;
	}

}

自定义异常类的Handler

import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;

import com.lims.api.exception.AbstractExceptionHandler;
import com.lims.api.security.web.exception.DuplicatedUserException;

@Component
@Order(Ordered.LOWEST_PRECEDENCE)
public class DuplicatedUserExceptionHandler extends AbstractExceptionHandler<DuplicatedUserException> {

	public DuplicatedUserExceptionHandler() {
		
		super(DuplicatedUserException.class.getSimpleName());
		log.info("DuplicatedUserExceptionHandler Created");
	}
	

	@Override
	public HttpStatus getStatus(DuplicatedUserException ex) {
		return ex.getStatus();
	}

}

基于以上三个类,所有@Controller中所抛出的异常就可以被包含到Response中传递到前端。以下示例代码:

    @PostMapping("/sign-up")
    public void signUp(@RequestBody ApplicationUser user){
        if(!applicationUserService.isValid(user)) {
        	throw (new DuplicatedUserException(user.getUserName()).httpStatus(HttpStatus.CONFLICT));
        };
        user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
        applicationUserRepository.save(user);
    }

前端VUE大多数会使用Axios,这里也用它来示例:

 vm.$ajax.post('/api/users/sign-up', register)
            .then(function (res) {
              toastr.success(res.data.message)
            }).catch(function (error) {
              toastr.error(error.response.data.message)
            })

这样前后端的异常处理在结构上显得十分简洁,每一个自定义的异常都可以显示给用户更友好的信息,通过property文件对于信息的定义可以充分利用属性文件的多语言支持功能。

前端处理异常的代码无需任何条件处理,每一个异常的消息显示都是统一的代码。对于前端代码模块重用有着重要的作用。

Cheers!

【ruoyi-vue】前后端分离项目分析 RuoYi-Vue 是一个 Java EE 企业级快速开发平台,基于经典技术组合(Spring Boot、Spring Security、MyBatis、Jwt、Vue),内置模块如:部门管理、角色用户、菜单及按钮授权、数据权限、系统参数、日志管理、代码生成等。在线定时任务配置;支持集群,支持多数据源,支持分布式事务。(1)说明使用原生的@Validated进行参数校验时,都是特定的注解去校验(例如字段长度、大小、不为空等),我们也可以用自定义的注解去进行校验,例如项目中的@Xss注解。 阅读详情

相关推荐

【狂神说】分析前后端分离开源项目?

文章目录1.如何分析开源项目项目简介项目源码2.观察开源项目3.开源项目下载4.跑起来是第一步5.前后端分离项目固定套路6.如何找到一个开源项目 1.如何分析开源项目 学习的方式: 不知道这个代码怎么来的 这个代码跑不起来 这个项目对我们有什么帮助,不会模块化分析 任何一个开源项目,都可以让自己等到提升 代码自动生成:我们平时会写很多业务代码,用Mybatis Plus去生成的,第三方的工具包去生成 开源项目:eladmin 项目简介 一个基于 Spring Boot 2.1.0 、 Spring Bo

Redemption___的博客 1206

vue之axios使用

一、安装 1、 利用npm安装npm install axios --save 2、 利用bower安装bower install axios --save 3、 直接利用cdn引入 二、例子 1、 发送一个GET请求 //通过给定的ID来发送请求 axios.get('/user?ID=12345') .then(function(response){ con

itKingOne的博客 1万+

推荐一个基于Springboot + Vue 开发的前后端分离博客

接入QQ,微博第三方登录,接入腾讯云人机验证、websocket博客作为新手入门项目是十分不错的,项目所用的技术栈覆盖的也比较广,适合初学者学习。主要难点在于权限管理、第三方登录、websocket这块。做的不好的地方请大家见谅,有问题的或者有好的建议可以私聊联系我。

Java开发,人工智能,边缘计算,致力于掌握前沿技术 6387

全局异常捕获和自定义异常类

全局异常捕获, 自定义异常

m0_73152224的博客 1036

基于Java与Vue的前后端分离考试系统实战项目

在现代Web开发中,前后端分离架构已成为主流趋势。该架构将前端(用户界面)与后端(业务逻辑与数据处理)解耦,使两者可独立开发、测试与部署。与传统的MVC架构相比,前后端分离通过API(如RESTful)进行数据交互,提升了系统的可维护性与扩展性。前端(如Vue.js)专注于UI与交互体验,而后端(如Spring Boot)则负责数据处理、安全控制与业务逻辑实现。这种分工提升了团队协作效率,也更易于应对复杂的业务需求。

weixin_32311823的博客 1088

卷积神经网络-猫狗识别(附源码)

利用python实现一个卷积神经网络,训练猫狗数据集,实现对猫狗图片的预测识别

m0_63223213的博客 2万+

SpringBoot中自定义异常中,其前端页面的exception和message的值获取不到

SpringBoot中在有模板引擎的情况下,自定义错误响应页面,但是exception和message的值获取不到,时间戳timestamp和错误码status却可以获取到, 1)自定义的异常 public class UserNotExistException extends RuntimeException{ public UserNotExistException(){ super("用户不存在"); } } 12345 2)当用户名为come的时候,用户会不存在

SCU-JJkinging的博客 1575

贝叶斯神经网络(Bayesian Neural Network)

最近在研究贝叶斯神经网络,一些概念一直搞不清楚,这里整理一下相关内容,方便以后查阅。

梁小憨憨的博客 3653

《踩坑记录》vue3关于请求返回数据不刷新问题

前提:第一次接触vue3+ts的代码写法,本次错误是由于接收请求返回的变量声明方法不对,导致变量不是响应式的,虽然可以在控制台中打印出来,但是不会进行视图更新。 export default { components: { }, setup() { let tabData = [] //错误的写法 封装的请求方法({ 传入的参数 }).then((res) => { tab

Leporc的博客 2450

【报错】sqli-labs靶场搭建出现“Unable to connect to the database: security”

搭建sqli-labs靶场时,“Unable to connect to the database: security”报错解决

九芒星的博客 2991

Allegro模块复用:从原理图到PCB的完整流程与关键细节

本文详细介绍了Allegro模块复用从原理图到PCB的完整流程与关键细节,包括DSN和MDD文件的创建、模块调用的实战技巧以及双向同步与版本控制方法。通过标准化处理和高级复用技巧,能显著提升PCB设计效率,减少重复工作时间。适用于智能硬件和工业控制等领域的工程师。

weixin_30252709的博客 332

ajax异步错误原因,记一次使用ajax时忽略其“异步”性质而犯的低级错误

记一次使用ajax时忽略其“异步”性质而犯的低级错误2020年07月14日|萬仟网IT编程 |我要评论前言前些天在使用ajax的时候,犯了傻,改一个bug改了很久,今天特地记录一下。问题描述使用ajax请求后台数据,然后加入到html页面中,思路流程大概是这样的:ajax请求后台数据全部后台数据保存到一个全局变量(数组)将请求到的部分数据动态加入...

weixin_31880471的博客 681

手机抽奖页面代码html,html5大转盘抽奖支持手机转盘抽奖代码

特效描述:html5 大转盘抽奖 支持手机 转盘抽奖代码。html5转盘,html5抽奖,手机转盘,手机抽奖,手机转盘抽奖,可配置奖品抽奖。代码结构1. 引入CSS2. 引入JS3. HTML代码大转盘活动var turnplate={restaraunts:[],//大转盘奖品名称colors:[],//大转盘奖品区块对应背景颜色outsideRadius:192,//大转盘外圆的半径textR...

weixin_39628551的博客 1861

Java大牛带你4小时开发一个SpringBoot+vue前后端分离博客项目

Java后端接口开发 1、前言 从零开始搭建一个项目骨架,最好选择合适,熟悉的技术,并且在未来易拓展,适合微服务化体系等。所以一般以Springboot作为我们的框架基础,这是离不开的了。 然后数据层,我们常用的是Mybatis,易上手,方便维护。但是单表操作比较困难,特别是添加字段或减少字段的时候,比较繁琐,所以这里我推荐使用Mybatis Plus(https://mp.baomidou.com/),为简化开发而生,只需简单配置,即可快速进行 CRUD 操作,从而节省大量时间。 作为一个项...

一入Java深似海 2万+

【32】C# WinForm入门到精通 ——打开文件OpenFileDialog 【属性、方法、事件、实例、源码】

本文介绍了WinForm开发中OpenFileDialog控件的关键属性及其应用。OpenFileDialog是.NET Framework提供的文件对话框控件,主要用于选择、打开文件操作。文章详细讲解了11个核心属性:AddExtension(自动补全扩展名)、AutoUpgradeEnabled(外观升级)、CheckFileExists/CheckPathExists(文件/路径存在验证)、DefaultExt(默认扩展名)、DereferenceLinks(解析快捷方式)、FileName/File

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1534

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

嵌入式阿齐Archie 2万+

超详细!4小时开发一个SpringBoot+vue前后端分离博客项目!!

文章总体分为2大部分,Java后端接口和vue前端页面,比较长,因为不想分开发布,真正想你4小时学会,哈哈。先看效果:项目演示:www.markerhub.com:8084/blogs不多说,开始敲代码。从零开始搭建一个项目骨架,最好选择合适,熟悉的技术,并且在未来易拓展,适合微服务化体系等。所以一般以Springboot作为我们的框架基础,这是离不开的了。然后数据层,我们常用的是Mybatis,易上手,方便维护。但是单表操作比较困难,特别是添加字段或减少字段的时候,比较繁琐,所以这里我推荐使用Mybati

weixin_42907150的博客 8986

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

【Vue+SpringBoot】超详细!一周开发一个SpringBoot + Vue+MybatisPlus+Shiro+JWT+Redis前后端分离个人博客项目!!!【项目完结】

项目目录资源准备前后端分离项目技术栈Java后端接口开发1、前言2、新建Springboot项目3、整合mybatis plus3、统一结果封装4、整合shiro+jwt,并会话共享ShiroConfigAccountRealmJwtTokenAccountProfileJwtFilter5、异常处理6、实体校验7、跨域问题Swagger2配置8、登录接口开发9、博客接口开发10、后端总结Vue前端页面开发1、前言2、项目演示3、环境准备4、新建项目5、安装element-ui6、安装axios7、页面路由

胡毛毛的博客 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

推荐七个略火的 SpringBoot+Vue 项目

前后端分离已经在慢慢走进各公司的技术栈,根据松哥了解到的消息,不少公司都已经切换到这个技术栈上面了。即使贵司目前没有切换到这个技术栈上面,松哥也非常建议大家学习一下前后端分离开发,以免在公司干了两三年,SSH 框架用的滚瓜烂熟,出来却发现自己依然没有任何优势! 其实前后端分离本身并不难,后段提供接口,前端做数据展示,关键是这种思想。很多人做惯了前后端不分的开发,在做前后端分离的时候,很容易带进来一...

江南一点雨的专栏 2万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

从 Vue 到 Java:前后端分离项目后端迁移完整教程

Vue 前端项目迁移到 Java 后端的核心是 “接口对齐、数据一致、逻辑完整通过本文的步骤,可实现前端最小改动、后端平稳迁移。后续可基于 Java 生态进一步优化:引入 Spring Cloud 实现微服务拆分;用 Elasticsearch 优化全文检索;集成消息队列(RabbitMQ)处理异步任务。迁移过程中建议 “分步迁移、小步验证”,先迁移核心接口(如登录、首页数据),再扩展到全量功能,降低风险。

2301_81512868的博客 1534

RUOYI框架在实际项目中的应用二:Ruoyi前后端分离版本-RuoYi-Vue

1、系统环境Java EE 82、主框架3、持久层4、视图层Vue 2.6.xcom.ruoyi├── common // 工具类│ └── annotation // 自定义注解│ └── config // 全局配置│ └── constant // 通用常量│ └── core // 核心控制│ └── enums // 通用枚举│ └── exception // 通用异常│ └── filter // 过滤器处理│ └── utils // 通用类处理。

苍煜 3767

前后端分离项目_前后端分离的开源项目,我推荐这几个!

不少同学问前后端分离到底是怎么回事?说实话,这只是一种思想,没必要那么在意。这里,我给大家整理了一些还不错的前后端分离项目,供大家去学习。美人鱼star 数 3499项目地址:https://gitee.com/mumu-osc/NiceFish听名字就知道这是个不错的项目,事实上确实不赖。NiceFish(美人鱼) 是一个系列项目,目标是示范前后端分离的开发模式:前端浏览器、移动端、E...

weixin_28954623的博客 1968

前后端分离博客项目

文章总体分为2大部分,Java后端接口和vue前端页面. 先看效果: Java后端接口开发 1、前言 从零开始搭建一个项目骨架,最好选择合适,熟悉的技术,并且在未来易拓展,适合微服务化体系等。所以一般以Springboot作为我们的框架基础,这是离不开的了。 然后数据层,我们常用的是Mybatis,易上手,方便维护。但是单表操作比较困难,特别是添加字段或减少字段的时候,比较繁琐,所以这里我推荐使用MybatisPlus(mp.baomidou.com/),为简化开发而生,只…CRUD...

Cybenko 1718
上一篇: MongoDB中类似关系数据库 like (%query%)查询方法
下一篇: 望山跑死马
java_augur
博客等级 码龄22年 67粉丝 64原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值