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中进行消息统一处理

目的是国际化

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

这样前端就能简化书写

小结

目录
相关文章
|
监控 前端开发 JavaScript
一步一步搭建前端监控系统:接口请求异常监控篇
摘要: 如何监控HTTP请求错误? 作者:一步一个脚印一个坑 原文:搭建前端监控系统(四)接口请求异常监控篇 Fundebug经授权转载,版权归原作者所有。 背景:市面上的监控系统有很多,大多收费,对于小型前端项目来说,必然是痛点。
1913 0
|
7天前
|
设计模式 JSON 前端开发
SSMP整合案例第四步 表现层controller开发及用Result进行统一消息处理
SSMP整合案例第四步 表现层controller开发及用Result进行统一消息处理
17 2
|
26天前
|
前端开发 Java 程序员
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
|
2月前
|
移动开发 前端开发
基于若依的ruoyi-nbcio流程管理系统自定义业务回写状态的一种新方法(二)
基于若依的ruoyi-nbcio流程管理系统自定义业务回写状态的一种新方法(二)
25 2
|
2月前
|
移动开发 前端开发
基于若依的ruoyi-nbcio流程管理系统自定义业务回写状态的一种新方法(一)
基于若依的ruoyi-nbcio流程管理系统自定义业务回写状态的一种新方法(一)
25 1
|
JSON 前端开发 Java
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
779 0
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
|
前端开发 Java Spring
源码浅析SpringMVC请求的流转过程
Spring MVC框架使用了其”模型-视图-控制器”( Model-View-Controller )架构方式,用于开发灵活且松散耦合的 Web 应用程序。我们都使用过SpringMVC来处理信息,并渲染视图到Browser。但需要注意的是,在现在的架构中,大都采用了前后端分离的情况,而我们在使用SpringMVC的时候,只需要关注M(Model),C(Controller)这两个部分,而视图渲染的部分则交给了前端。
290 0
源码浅析SpringMVC请求的流转过程
|
XML SQL 前端开发
微服务调用事项;分析Java微服务优点
微服务调用事项 微服务=配置+流程+组件 微服务调用:
167 0
微服务调用事项;分析Java微服务优点
|
Java 微服务 Spring
微服务项目:尚融宝(11)(后端接口:统一日志处理)
默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别
微服务项目:尚融宝(11)(后端接口:统一日志处理)
|
JSON 前端开发 数据格式
微服务项目:尚融宝(9)(后端接口:统一返回结果)
项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端对数据的操作更一致、轻松。 一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含 状态码、返回消息、数据 这几部分内容
微服务项目:尚融宝(9)(后端接口:统一返回结果)