码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 使用@RestControllerAdvice统一处理@ResponseBody的返回前端数据


    一、前言

    spring mvc下,在controller控制类中,标注了@ResponseBody的方法正常来说返回的是json对象,有时候还想额外在特定条件下处理一些数据(使用if),又或者是每个返回json数据的方法都可能需要做同样的处理,就需要使用@RestControllerAdvice标注方法进行统一处理。

    这样做最大的好处就是不用修改原来的controller,以及可以所有controller通用,处理较为灵活。

    二、前期准备,新建Result包装类

    该类用于收集以及格式化输出最终数据

    1. import com.fasterxml.jackson.annotation.JsonInclude;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. import lombok.experimental.Accessors;
    6. @Data
    7. @NoArgsConstructor
    8. @AllArgsConstructor
    9. @Accessors(chain = true)
    10. @JsonInclude(JsonInclude.Include.NON_NULL)
    11. public class Result {
    12. private int code;
    13. private String message;
    14. private T data;
    15. /**
    16. * 成功
    17. */
    18. public static Result success(T data) {
    19. Result result = new Result();
    20. result.setCode(ResultMsgEnum.SUCCESS.getCode());
    21. result.setMessage(ResultMsgEnum.SUCCESS.getMessage());
    22. result.setData(data);
    23. return result;
    24. }
    25. /**
    26. * 失败,自己输入失败code和message
    27. */
    28. public static Result error(int code, String message) {
    29. return new Result(code, message,null);
    30. }
    31. public enum ResultMsgEnum {
    32. SUCCESS(0, "成功"),
    33. FAIL(-1, "失败"),
    34. AUTH_ERROR(502, "授权失败!"),
    35. SERVER_BUSY(503, "服务器正忙,请稍后再试!"),
    36. DATABASE_OPERATION_FAILED(504, "数据库操作失败");
    37. private int code;
    38. private String message;
    39. ResultMsgEnum(int code, String message) {
    40. this.code = code;
    41. this.message = message;
    42. }
    43. public int getCode() {
    44. return this.code;
    45. }
    46. public String getMessage() {
    47. return this.message;
    48. }
    49. }
    50. }

    三、实现ResponseBodyAdvice接口

    该类主要实现对控制类准备返回到前端的json数据进行统一处理

    1. import net.sf.json.JSONObject;
    2. import org.springframework.core.MethodParameter;
    3. import org.springframework.http.MediaType;
    4. import org.springframework.http.converter.HttpMessageConverter;
    5. import org.springframework.http.server.ServerHttpRequest;
    6. import org.springframework.http.server.ServerHttpResponse;
    7. import org.springframework.web.bind.annotation.RestControllerAdvice;
    8. import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    9. import java.util.ArrayList;
    10. import java.util.HashMap;
    11. @RestControllerAdvice
    12. public class ResponseAdvice implements ResponseBodyAdvice {
    13. /**
    14. * 是否开启功能 true:开启
    15. */
    16. @Override
    17. public boolean supports(MethodParameter methodParameter, Class> aClass) {
    18. return true;
    19. }
    20. /**
    21. * 处理返回结果
    22. */
    23. @Override
    24. public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
    25. //处理字符串类型数据
    26. if(o instanceof String){
    27. return JSONObject.fromObject(Result.success(o));
    28. }
    29. //返回类型是否已经封装
    30. if(o instanceof Result){
    31. return o;
    32. }
    33. //已经处理过的前端可以识别的格式数据跳过
    34. if(o instanceof ArrayList || o instanceof HashMap){
    35. return o;
    36. }
    37. return Result.success(o);
    38. }
    39. }
    40. 四、测试

      1. @Slf4j
      2. @RestController
      3. @RequestMapping("/test")
      4. public class TestController {
      5. @ResponseBody
      6. @GetMapping(path = "/my_test")
      7. public String MyTest() {
      8. return "测试";
      9. }
      10. }

       返回的字符串

      {code:0,data:"测试",msg:"成功"}

      五、注意事项

      1、实测,如果数据库报错,直接跳走了,不会执行到ResponseAdvice方法,建议转到统一异常处理处进行处理。

    41. 相关阅读:
      语音识别接口试用
      连通性
      Python爬取豆瓣电影+数据可视化,爬虫教程!
      [附源码]java毕业设计校园出入管理系统
      中国历史朝代
      DNS (Domain Name System) 域名解析过程
      青岛大学数据结构与算法——第3章
      从传统行业到半导体行业开发(YMS,DMS,EAP,EDA)最好的语言就是用实干来践行自己的承诺。
      R语言实现分位数回归和二次分位数回归
      VMware环境配置
    42. 原文地址:https://blog.csdn.net/liangqibinde/article/details/132748468
      • 最新文章
      • 【JVM】编译执行与解释执行的区别是什么?JVM 使用哪种方式?
        用 Hashids 优雅解决 C 端自增 ID 暴露问题
        V8引擎 精品漫游指南--Ignition篇(上) 指令 栈帧 槽位 调用约定 内存布局 基础内容
        LLVM Pass快速入门(四):代码插桩
        milkup:桌面端 markdown AI续写和即时渲染
        基于项目工程构建SBOM(软件物料清单)的研究
        鸿蒙应用开发UI基础第二节:鸿蒙应用程序框架核心解析与实操
        .NET 中如何快速实现 List 集合去重?
        扣子Coze实战:从0到1打造抖音+小红书热点监控智能体
        浅谈数据访问层
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      小工具 小游戏
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

      京公网安备 11010502049817号