码农知识堂 - 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. 相关阅读:
      jvm八股
      聊聊秒杀系统的设计(四)
      第一次微生物学实验
      学习vue笔记一——初识vue
      androd 如何使得升级更加容易 以及规范app文件使用
      贝叶斯公式
      android的camera学习(2)——底层驱动分析
      Java中Integer的最大值和最小值
      论文解读:Segment Anything
      【Docker】安装RabbitMQ
    42. 原文地址:https://blog.csdn.net/liangqibinde/article/details/132748468
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号