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

目录

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

相关推荐
闲猫7 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
哥不想学算法7 小时前
【C++】字符串字面量拼接
开发语言·c++
paopaokaka_luck9 小时前
英语单词学习系统的设计与实现(基于艾宾浩斯遗忘曲线的智能复习机制、语音朗读、多题型测试与错题自动收录、Echarts图形化分析)
vue.js·spring boot·后端·echarts
gugucoding9 小时前
21. 【C语言】打包不同类型:结构体
c语言·开发语言
自信的未来9 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
Brookty9 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
怕孤单的草丛10 小时前
缓存管理面临的主要问题
java·数据库·缓存
F202269748610 小时前
西门子 PLC 与 C# 通信
开发语言·c#
gugucoding10 小时前
31. 【C语言】堆栈与队列的实现
c语言·开发语言·数据结构·链表