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

目录

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类型的数据包装在对象中返回即可。

相关推荐
No0d1es几秒前
2025年 CSP-J1 入门级初赛 C++真题
开发语言·c++·青少年编程·csp·信息学奥赛·初赛
August_._9 分钟前
【MySQL】触发器、日志、锁机制 深度解析
java·大数据·数据库·人工智能·后端·mysql·青少年编程
Halo_tjn10 分钟前
基于 Object 类及包装类的专项实验
java·开发语言·计算机
百锦再11 分钟前
第10章 错误处理
java·git·ai·rust·go·错误·pathon
伊布拉西莫16 分钟前
Spring 6.x HTTP interface 使用说明
spring·restclient
拾忆,想起19 分钟前
超时重传 vs 快速重传:TCP双保险如何拯救网络丢包?
java·开发语言·网络·数据库·网络协议·tcp/ip·php
@老蝴19 分钟前
Java EE - 线程的状态
开发语言·java-ee·intellij-idea
從南走到北21 分钟前
JAVA国际版同城外卖跑腿团购到店跑腿多合一APP系统源码支持Android+IOS+H5
android·java·ios·微信小程序·小程序
budingxiaomoli26 分钟前
多线程(一)
java·开发语言·jvm·java-ee
codervibe30 分钟前
Spring Boot 热启动配置实战:从手动重启到秒级反馈
spring boot·后端