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

目的是国际化

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

这样前端就能简化书写

小结

目录
相关文章
|
5月前
|
前端开发 小程序 Java
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
本文详细介绍了如何在SpringBoot项目中统一处理接口返回结果及全局异常。首先,通过封装`ResponseResult`类,实现了接口返回结果的规范化,包括状态码、状态信息、返回信息和数据等字段,提供了多种成功和失败的返回方法。其次,利用`@RestControllerAdvice`和`@ExceptionHandler`注解配置全局异常处理,捕获并友好地处理各种异常信息。
2330 0
【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
|
7月前
|
前端开发 Java 程序员
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
|
8月前
|
前端开发 Java 程序员
Spring Boot统一功能处理(拦截器, 统一数据返回格式, 统一异常处理)
Spring Boot统一功能处理(拦截器, 统一数据返回格式, 统一异常处理)
146 1
|
8月前
|
SQL 前端开发 Java
SpringBoot 拦截器 统一结果返回 统一异常处理
SpringBoot 拦截器 统一结果返回 统一异常处理
388 0
|
数据采集 JSON 前端开发
SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!
SpringBoot 如何统一后端返回格式?老鸟们都是这样玩的!
189 1
|
安全 Java 程序员
SpringBoot中如何实现业务校验,这种方式才叫优雅!
SpringBoot中如何实现业务校验,这种方式才叫优雅!
212 0
|
Java API
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
333 7
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
|
数据采集 前端开发 Java
SpringBoot使用@RestControllerAdvice无侵入返回统一结果包装
SpringBoot使用@RestControllerAdvice无侵入返回统一结果包装
594 0
|
JSON 前端开发 Java
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
924 0
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!

热门文章

最新文章

下一篇
开通oss服务