统一数据格式返回,统一异常处理

目录

1.统一数据格式返回

2.统一异常处理

3.接口返回String类型问题


1.统一数据格式返回

  1. 添加@ControllerAdvice注解
  2. 实现ResponseBodyAdvice接口
  3. 重写supports方法,beforeBodyWrite方法
java 复制代码
/**
 * 统一数据格式返回的保底类 对于一些非对象的数据的再统一 即非对象的封装成对象再返回
 */
@ControllerAdvice //控制器通知类
public class ResponseAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;

    /**
     * 开关
     * true表示返回结果作统一处理
     * false不处理
     */
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    
    // 该方法具体实现统一返回   
    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if(body instanceof AjaxResult) {
            return body;
        }
        // 字符串比较特殊 是由于序列化问题导致
        // 对于字符串类型,可以使用SpringBoot提供的Jackson实现信息的序列化
        if(body instanceof String) {
            return objectMapper.writeValueAsString(body);
        }
        return AjaxResult.success("",body);
    }
}

String类型需要特殊处理的原因:类型转换异常。即序列化问题。

由于我设置了统一返回类(code,msg,data),String类型的数据在上面第一步(返回的body中)就已经被包装成一个对象了,后续传参也都是泛型,直到调用 addDefaultHeaders 方法,接收却是String类型的。对象是不能自动转成String类型的。并且是String类型才会走上面的流程。

解决办法就是使用SpringBoot提供的Jackson库,可以将对象转成Json格式的字符串。即序列化。


2.统一异常处理

  1. 加ControllerAdvice注解(控制器通知类)
  2. 加ResponseAdvice注解(类上或方法上,表示返回的是非页面的数据)
  3. 加ExceptionHandler注解(在每个方法上加)
java 复制代码
/**
 * 捕获项目运行中出现的异常,并进行统一异常的返回
 * 捕获流程 先捕获匹配具体的异常,没找到(即我们没定义),再往上到RunTimeException,没匹配到,就再往上到Exception 即按照异常继承关系往上找
 * 能不能捕获到具体的异常,要看我们自定义的方法中有没有写具体的异常
 */
@ResponseBody //务必加 才能返回数据类型 不加返回页面 可以加类上或方法上
@ControllerAdvice
public class ErrorHandler {

    @ExceptionHandler
    public AjaxResult handler(Exception e) {
        return AjaxResult.fail("内部发生异常");
    }

    @ExceptionHandler
    public AjaxResult handler(RuntimeException e) {
        return AjaxResult.fail("内部发生异常");
    }

    @ExceptionHandler
    public AjaxResult handler(NullPointerException e) {
        return AjaxResult.fail("空指针异常");
    }

    @ExceptionHandler
    public AjaxResult handler(ArithmeticException e) {
        return AjaxResult.fail("算术异常");
    }


}

3.接口返回String类型问题

接口返回String类型的数据时,需要转Json格式 。所以尽量少用,直接将String类型的数据包装在对象中返回即可。

相关推荐
caimouse13 小时前
reactos编码规范
c语言·开发语言
xieliyu.17 小时前
Java算法精讲:双指针(三)
java·开发语言·算法
星辰徐哥17 小时前
Spring Boot 微服务架构设计与实现
spring boot·后端·微服务
星辰徐哥17 小时前
Spring Boot 数据导入导出与报表生成
spring boot·后端·ui
明夜之约17 小时前
Spring Boot 自动装配源码
java·spring boot·后端
Leaton Lee17 小时前
Spring Boot分层架构详解:从Controller到Service再到Mapper的完整流程
java·spring boot·后端·架构
Micro麦可乐17 小时前
Spring Boot 实战:从零设计一个短链系统(含完整代码与数据库设计)
数据库·spring boot·后端·哈希算法·雪花算法·短链系统
Jinkxs17 小时前
Resilience4j- 与 Spring Boot 快速集成:自动配置与基础注解使用
java·spring boot·后端
毕设源码_郑学姐17 小时前
计算机毕业设计springboot网络相册设计与实现 基于Spring Boot框架的在线相册管理系统开发与应用 Spring Boot驱动的网络影集设计与实践
spring boot·后端·课程设计
辣机小司18 小时前
【踩坑记录:Spring Boot 配置文件读取值不一致?警惕 YAML 的“八进制陷阱”与 SnakeYAML 版本之谜】
java·spring boot·后端·yaml·踩坑记录