码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • Springboot统一返回格式


    1、定义返回标准格式

    一个标准的返回格式至少包含3部分:

    1. status 状态值:由后端统一定义各种返回结果的状态码

    2. message 描述:本次接口调用的结果描述

    3. data 数据:本次返回的数据。

      1. package com.online.analyze.comm.util;
      2. import lombok.AllArgsConstructor;
      3. import lombok.Data;
      4. import lombok.NoArgsConstructor;
      5. import java.io.Serializable;
      6. @Data
      7. @NoArgsConstructor
      8. @AllArgsConstructor
      9. public class ResultData implements Serializable {
      10. public static final Integer SUCCESS_CODE = 0;
      11. public static final Integer FAILURE_CODE = -1;
      12. public static final Integer ERROR_CODE = 9999;
      13. public static final Integer DEALING = 2222;
      14. public static final String DEALING_MSG = "处理中";
      15. public static final String SUCCESS_MSG = "成功";
      16. public static final String FAILURE_MSG = "失败";
      17. public static final String ERROR_MSG = "系统异常";
      18. private Integer code;
      19. private String msg;
      20. protected T data;
      21. public static ResultData success(){
      22. return new ResultData(SUCCESS_CODE,SUCCESS_MSG,null);
      23. }
      24. public static ResultData success(String msg,T t){
      25. return new ResultData(SUCCESS_CODE,msg,t);
      26. }
      27. public static ResultData success(T t){
      28. return new ResultData(SUCCESS_CODE,SUCCESS_MSG,t);
      29. }
      30. public static ResultData fail(){
      31. return new ResultData(FAILURE_CODE,FAILURE_MSG,null);
      32. }
      33. public static ResultData fail(T t){
      34. return new ResultData(FAILURE_CODE,FAILURE_MSG,t);
      35. }
      36. public static ResultData fail(String msg,T t){
      37. return new ResultData(FAILURE_CODE,msg,t);
      38. }
      39. public static ResultData fail(Integer code,String msg,T t){
      40. return new ResultData(code,msg,t);
      41. }
      42. public static ResultData fail(String msg){
      43. return new ResultData(FAILURE_CODE,msg,null);
      44. }
      45. public static ResultData error(){
      46. return new ResultData<>(ERROR_CODE,ERROR_MSG,null);
      47. }
      48. public static ResultData error(String msg){
      49. return new ResultData<>(ERROR_CODE,msg,null);
      50. }
      51. public static ResultData dealing(){
      52. return new ResultData<>(DEALING,DEALING_MSG,null);
      53. }
      54. public static ResultData dealing(String msg){
      55. return new ResultData<>(DEALING,msg,null);
      56. }
      57. public static ResultData dealing(String msg,T t){
      58. return new ResultData<>(DEALING,msg,t);
      59. }
      60. public static ResultData dealing(T t){
      61. return new ResultData<>(DEALING,DEALING_MSG,t);
      62. }
      63. }

      接口统一返回

      return ResultData.success("msg",data);

    2、借助SpringBoot提供的ResponseBodyAdvice,统一处理controller返回值,不要每个接口都手工制定ResultData返回值
     

    1. “
    2. ResponseBodyAdvice的作用:拦截Controller方法的返回值,统一处理返回值/响应体,一般用来统一返回格式,加解密,签名等等。
    3. ”
    1. public interface ResponseBodyAdvice {
    2. /**
    3. * 是否支持advice功能
    4. * true 支持,false 不支持
    5. */
    6. boolean supports(MethodParameter var1, Class> var2);
    7. /**
    8. * 对返回的数据进行处理
    9. */
    10. @Nullable
    11. T beforeBodyWrite(@Nullable T var1, MethodParameter var2, MediaType var3, Class> var4, ServerHttpRequest var5, ServerHttpResponse var6);
    12. }
    1. //实现类处理
    2. //@RestControllerAdvice是@RestController注解的增强,可以实现三个方面的功能:
    3. //全局异常处理
    4. //全局数据绑定
    5. //全局数据预处理
    6. @RestControllerAdvice
    7. public class ResponseAdvice implements ResponseBodyAdvice {
    8. @Autowired
    9. private ObjectMapper objectMapper;
    10. @Override
    11. public boolean supports(MethodParameter methodParameter, Class> aClass) {
    12. return true;
    13. }
    14. @SneakyThrows
    15. @Override
    16. public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
    17. //Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成json
    18. if(o instanceof String){
    19. return objectMapper.writeValueAsString(ResultData.success(o));
    20. }
    21. if(o instanceof ResultData){
    22. return o;
    23. }
    24. return ResultData.success(o);
    25. }
    26. }
    27. 3、针对异常的处理

      上边进行的封装,如果遇到异常返回时,仍然会正常返回返回的也是成功的状态,所以需要针对异常进行全局异常统一处理。

       

      1. @Slf4j
      2. @RestControllerAdvice
      3. public class RestExceptionHandler {
      4. /**
      5. * 默认全局异常处理。
      6. * @param e the e
      7. * @return ResultData
      8. */
      9. @ExceptionHandler(Exception.class)
      10. @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
      11. public ResultData exception(Exception e) {
      12. log.error("全局异常信息 ex={}", e.getMessage(), e);
      13. return ResultData.fail(ReturnCode.RC500.getCode(),e.getMessage());
      14. }
      15. }
      16. @RestControllerAdvice,RestController的增强类,可用于实现全局异常处理器
      17. @ExceptionHandler,统一处理某一类异常,从而减少代码重复率和复杂度,比如要获取自定义异常可以@ExceptionHandler(BusinessException.class)
      18. @ResponseStatus指定客户端收到的http状态码
      1. //实现类处理
      2. //@RestControllerAdvice是@RestController注解的增强,可以实现三个方面的功能:
      3. //全局异常处理
      4. //全局数据绑定
      5. //全局数据预处理
      6. @RestControllerAdvice
      7. public class ResponseAdvice implements ResponseBodyAdvice {
      8. @Autowired
      9. private ObjectMapper objectMapper;
      10. @Override
      11. public boolean supports(MethodParameter methodParameter, Class> aClass) {
      12. return true;
      13. }
      14. @SneakyThrows
      15. @Override
      16. public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType, Class> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) {
      17. //Controller直接返回String的话,SpringBoot是直接返回,故我们需要手动转换成json
      18. if(o instanceof String){
      19. return objectMapper.writeValueAsString(ResultData.success(o));
      20. }
      21. //如果返回的结果是ResultData对象,直接返回即可
      22. if(o instanceof ResultData){
      23. return o;
      24. }
      25. return ResultData.success(o);
      26. }
      27. }
      28. 相关阅读:
        hive拉链表详解
        go slice切片的详细知识(包含底层扩容)——2
        Java的JDK基础
        eslint和prettier实现代码格式化
        awk判断整除(包含小数和负数)
        58同城2024届校招后端研发一面面经
        猿创征文|我的半年算法学习成长之路~
        【电源专题】案例:直接用LDO或Buck不香?为什么非要用Buck降压再转LDO?
        轻松掌握JavaScript字符串操作的10个小技巧
        杰理之AT 包格式【篇】
      29. 原文地址:https://blog.csdn.net/lingxiyizhi_ljx/article/details/127640166
        • 最新文章
        • 攻防演习之三天拿下官网站群
          数据安全治理学习——前期安全规划和安全管理体系建设
          企业安全 | 企业内一次钓鱼演练准备过程
          内网渗透测试 | 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号