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

目的是国际化

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

这样前端就能简化书写

小结

目录
相关文章
|
1月前
|
数据管理 Nacos 开发者
"Nacos架构深度解析:一篇文章带你掌握业务层四大核心功能,服务注册、配置管理、元数据与健康检查一网打尽!"
【10月更文挑战第23天】Nacos 是一个用于服务注册发现和配置管理的平台,支持动态服务发现、配置管理、元数据管理和健康检查。其业务层包括服务注册与发现、配置管理、元数据管理和健康检查四大核心功能。通过示例代码展示了如何在业务层中使用Nacos,帮助开发者构建高可用、动态扩展的微服务生态系统。
77 0
|
6月前
|
设计模式 JSON 前端开发
SSMP整合案例第四步 表现层controller开发及用Result进行统一消息处理
SSMP整合案例第四步 表现层controller开发及用Result进行统一消息处理
58 2
|
6月前
|
前端开发 Java 程序员
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
SpringBoot统一功能处理,拦截器,统一数据格式,捕捉异常
|
前端开发 Java 微服务
微服务之间调用的异常应该如何处理
在分布式服务的场景下,业务服务都将进行拆分,不同服务之间都会相互调用,如何做好异常处理是比较关键的,可以让业务人员在页面使用系统报错后,很清楚的看到服务报错的原因,而不是返回代码级别的异常报错,比如NullException、IllegalArgumentException、FeignExecption等异常报错,这样就会让非技术人员看到了一头雾水,从而很降低用户的体验感。
|
安全 Java 程序员
SpringBoot中如何实现业务校验,这种方式才叫优雅!
SpringBoot中如何实现业务校验,这种方式才叫优雅!
178 0
|
Java API
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
327 7
SpringBoot中如何参数校验、统一异常、统一响应以及自定义注解
|
JSON 前端开发 Java
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
892 0
Spring Boot 统一参数校验、统一异常、统一响应,这才是优雅的处理方式!
|
JSON 搜索推荐 前端开发
微服务项目:尚融宝(10)(后端接口:统一异常处理)
微服务项目:尚融宝(10)(后端接口:统一异常处理)
微服务项目:尚融宝(10)(后端接口:统一异常处理)
|
Java 微服务 Spring
微服务项目:尚融宝(11)(后端接口:统一日志处理)
默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别
微服务项目:尚融宝(11)(后端接口:统一日志处理)
|
JSON 前端开发 数据格式
微服务项目:尚融宝(9)(后端接口:统一返回结果)
项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端对数据的操作更一致、轻松。 一般情况下,统一返回数据格式没有固定的格式,只要能描述清楚返回的数据状态以及要返回的具体数据就可以。但是一般会包含 状态码、返回消息、数据 这几部分内容
微服务项目:尚融宝(9)(后端接口:统一返回结果)