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

目录

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

相关推荐
bugu___1 分钟前
仿muduo库实现并发服务器(3)
开发语言·c++
爱装代码的小瓶子2 分钟前
【Linux基础】操作系统下的进程与虚拟内存的关系
android·java·服务器
betazhou3 分钟前
借用Deepseek写一个定期清理备份文件的ps脚本
开发语言·前端·javascript·ps·deepseek·清理备份文件
淮北4943 分钟前
大模型学习(二、使用lora进行微调)
java·服务器·学习
瑞雪兆丰年兮5 分钟前
[从0开始学Java|第一天]Java入门
java·开发语言
我爱娃哈哈5 分钟前
SpringBoot 实现 RSA+AES 自动接口解密
java·spring boot·后端
崎岖Qiu5 分钟前
SpringBoot:基于注解 @PostConstruct 和 ApplicationRunner 进行初始化的区别
java·spring boot·后端·spring·javaee
沈雅馨6 分钟前
SQL语言的云计算
开发语言·后端·golang
东东最爱敲键盘6 分钟前
第7天 进程间通信
java·服务器·前端
九皇叔叔9 分钟前
【04】SpringBoot3 MybatisPlus 查询(Mapper)
java·mybatis·mybatis plus