SSMP整合案例第七步 前后端业务异常消息统一处理

简介: SSMP整合案例第七步 前后端业务异常消息统一处理

在Spring Boot中,异常处理是通过统一的方式来捕获和处理应用程序中抛出的异常,以提高系统的可靠性和用户体验。以下是在Spring Boot中常见的异常处理方法:

1. 全局异常处理器

Spring Boot允许定义一个全局的异常处理器,它可以捕获应用程序中未被其他处理器捕获的所有异常。通常使用 @ControllerAdvice 注解和 @ExceptionHandler 注解来实现。

@ControllerAdvice
public class GlobalExceptionHandler {
 
    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleException(Exception ex) {
        // 处理异常,返回合适的响应信息
        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
                             .body("An error occurred: " + ex.getMessage());
    }
 
    // 可以定义其他特定异常的处理方法
}

2. 控制器层异常处理

在具体的控制器中,也可以定义特定类型的异常处理方法,用于捕获和处理该控制器中抛出的异常。

@RestController
@RequestMapping("/api")
public class MyController {
 
    @GetMapping("/resource")
    public ResponseEntity<String> getResource() {
        if (someCondition) {
            throw new CustomException("Resource not found");
        }
        return ResponseEntity.ok("Resource found");
    }
 
    @ExceptionHandler(CustomException.class)
    public ResponseEntity<String> handleCustomException(CustomException ex) {
        return ResponseEntity.status(HttpStatus.NOT_FOUND)
                             .body("Resource not found: " + ex.getMessage());
    }
}

3. 自定义异常类

为了更好地管理和区分不同的异常情况,可以定义自定义的异常类,并在需要时抛出这些异常。

public class CustomException extends RuntimeException {
 
    public CustomException(String message) {
        super(message);
    }
}

4. ResponseEntity与异常处理

异常处理方法通常会返回 ResponseEntity 对象,这样可以更灵活地定义响应的状态码、消息体和头部信息。

@ExceptionHandler(CustomException.class)
public ResponseEntity<String> handleCustomException(CustomException ex) {
    return ResponseEntity.status(HttpStatus.NOT_FOUND)
                         .body("Resource not found: " + ex.getMessage());
}

5. 异常处理的最佳实践

  • 精细化处理:根据具体的业务需求和异常情况,合理地划分和定义异常处理器,提高代码的可读性和维护性。
  • 统一错误响应:确保异常处理器返回的响应符合统一的错误响应格式,以便客户端能够方便地处理错误情况。
  • 日志记录:在异常处理器中记录相关的异常信息和上下文,以便进行问题排查和系统监控。

Spring Boot的异常处理机制非常灵活,可以根据具体的项目需求进行定制化,保证系统在面对异常情况时能够稳定运行并提供良好的用户体验。

异常消息处理

我们当前的增删改查基本完成

我们当前的情况是在理想状态下完成的

但是实际开发中我们要抛出异常

业务在进行处理的时候

数据格式就是这样

前端拿到的信息我们应该去处理

前端如何去处理得去斟酌

即使前端出现了异常

我们也要让返回的异常信息让前端成功读取

我们有一个异常处理器

Spring MVC 属于 controller 层的技术

放这里就行

定义全新的数据访问格式

package com.bigdata1421.ssmp.controller.utils;
 
import lombok.Data;
 
@Data
public class Result {
    private Boolean flag;
    private Object data;
    private String msg;
    public Result(Boolean flag){
        this.flag=flag;
    }
    public Result(Boolean flag,Object data){
        this.flag=flag;
        this.data=data;
    }
 
    public Result(Boolean flag,String msg){
        this.flag=flag;
        this.msg=msg;
    }
 
}

也可以这样改写

异常处理类

package com.bigdata1421.ssmp.controller.utils;
 
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;
 
//作为 spring mvc 的异常处理器
@RestControllerAdvice
public class ProjectExceptionAdvice {
 
    @ExceptionHandler
    public Result doException(Exception ex){
        //记录日志
        //通知运维
        //通知开发
        ex.printStackTrace();
        return new Result(  "服务器故障,请稍后重试");
    }
 
}

Result类

package com.bigdata1421.ssmp.controller.utils;
 
import lombok.Data;
 
@Data
public class Result {
    private Boolean flag;
    private Object data;
    private String msg;
    public Result(Boolean flag){
        this.flag=flag;
    }
    public Result(Boolean flag,Object data){
        this.flag=flag;
        this.data=data;
    }
 
    public Result(String msg){
        this.flag=false;
        this.msg=msg;
    }
 
}

这样就能拿到报错信息

//修改
handleEdit() {
    //与添加功能绑定的是一个数据模型
    //绑定的是确定按钮 发起请求
    axios.put("/users", this.formData).then((res) => {
        //判断当前操作是否成功
        if (res.data.flag) {
            //关闭弹层
            this.cancel();
            this.$message.success("人员数据修改成功");
        }else {
            this.$message.error(res.data.msg);
        }
    }).finally(()=>{
        //重新加载页面
        this.getAll();
    });
},

空体判断

抛出异常给Spring mvc的异常消息处理机制

但是这样我们的代码有的是在前端页面中写的

有的是在服务器的三层架构里写的 这样不好

这样不好

先是异常处理

之后是代码核心逻辑处理

判断flag是否为ture 还是false 添加成功

进阶版

页面消息处理

没有传递消息加载默认消息

传递消息后加载指定消息

我们后端和前端都要进行处理

我们主要是在表现层Controller中进行消息统一处理

目的是国际化

让异常处理的时候交给后端统一处理

这样前端就能简化书写

小结

目录
相关文章
|
10月前
|
JSON Go 数据格式
从1开始,扩展Go语言后端业务系统的RPC功能
从1开始,扩展Go语言后端业务系统的RPC功能
120 0
|
7月前
|
前端开发 JavaScript
构建前端防腐策略问题之后端配合前端进行GraphQL改造变得不太现实的问题如何解决
构建前端防腐策略问题之后端配合前端进行GraphQL改造变得不太现实的问题如何解决
|
7月前
|
Java 数据库 开发者
"揭秘!SpringBoot+事务钩子,如何携手打造零差错、秒级响应的高效支付系统,让你的业务飞起来!"
【8月更文挑战第11天】构建高效稳定的支付系统时,Spring Boot凭借其快速开发与丰富生态成为优选框架。通过集成Spring事务管理抽象,@Transactional注解简化了数据库事务处理。针对复杂业务,可利用`TransactionSynchronizationManager`和`TransactionSynchronization`接口自定义事务钩子函数,在事务不同阶段执行特定逻辑,如支付成功或失败时的通知,确保数据一致性与业务完整性。
146 4
|
监控 小程序 Java
《优化接口设计的思路》系列:第五篇—接口发生异常如何统一处理
大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。
436 0
《优化接口设计的思路》系列:第五篇—接口发生异常如何统一处理
|
设计模式 Java 调度
SpringBoot 事件发布监听机制使用、分析、注意点 (一篇到位)
SpringBoot 事件发布监听机制使用、分析、注意点 (一篇到位)
1694 1
SpringBoot 事件发布监听机制使用、分析、注意点 (一篇到位)
|
10月前
|
前端开发 NoSQL 测试技术
Crossbar 后端开发调试混乱解决方案
Crossbar 后端开发调试混乱解决方案
81 0
|
安全 区块链
基于OKExChain的去中心化交易平台KSwap开发规则功能/逻辑源码方案
// 购买数字资产 function buy(uint amount) public payable returns (uint remaining) {【更全面的开发源码搭建可看我昵称】
|
JSON 前端开发 Java
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
961 0
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
|
编解码 负载均衡 Java
【Fegin技术专题】「原生态」从源码层面让你认识Feign工作流程和运作机制
【Fegin技术专题】「原生态」从源码层面让你认识Feign工作流程和运作机制
336 0
【Fegin技术专题】「原生态」从源码层面让你认识Feign工作流程和运作机制