精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

別錯過!Spring Boot 實現統一響應結果的五種方案

開發 前端
在 Spring Boot 項目開發中,隨著接口數量增多,不同接口的響應結果格式各異,這給前端開發和接口維護帶來諸多不便。

環境:SpringBoot3.4.2

1. 簡介

在 Spring Boot 項目開發中,隨著接口數量增多,不同接口的響應結果格式各異,這給前端開發和接口維護帶來諸多不便。前端需要針對不同格式做適配,增加開發成本;后端維護時,也易因格式混亂導致錯誤。

統一響應結果能解決這些問題。它規定所有接口返回相同格式的數據,如包含狀態碼、消息、數據等字段。例如,成功時返回狀態碼 200、消息“操作成功”和數據;失敗時返回對應錯誤碼和消息。這樣前端只需按統一格式解析,降低開發復雜度;后端維護也更便捷,只需關注業務邏輯。統一響應結果提升了代碼可讀性、可維護性,增強了前后端協作效率。

在本篇文章里,我們將針對 Spring Boot 中實現統一響應結果,詳細闡述 6 種切實可行的方案。

2.實戰案例

2.1 自定義響應實體類

定義一個通用的響應類,包含狀態碼、消息和數據。然后在Controller中返回這個類的實例。

自定義狀態碼

public enum ResultCode {
  SUCCESS(200, "操作成功"), FAILURE(400, "業務異常"), 
  UNAUTHORIZED(401, "未授權"), FORBIDDEN(403, "禁止訪問"), 
  NOT_FOUND(404, "資源不存在"), INTERNAL_ERROR(500, "系統錯誤") ;
  private final int code ;
  private final String msg ;
  // getters
}

自定義結果對象

public class ApiResponse<T> {
  private int code ;
  private String message ;
  private T data;
  public ApiResponse(int code, String message, T data) {
    this.code = code;
    this.message = message;
    this.data = data;
  }
  // 成功響應(帶數據)
  public static <T> ApiResponse<T> success(T data) {
    return new ApiResponse<>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMsg(), data);
  }
  // 失敗響應
  public static <T> ApiResponse<T> fail(ResultCode resultCode) {
    return new ApiResponse<>(resultCode.getCode(), resultCode.getMsg(), null);
  }
  // ...
  // getters, setters
}

Controller接口

@RestController
@RequestMapping("/way1")
public class Way1Controller {
  @GetMapping("/{id}")
  public ApiResponse<User> getUser(@PathVariable Long id) {
    return ApiResponse.success(new User(id, "Pack")) ;
  }
  // 錯誤處理
  @ExceptionHandler(Exception.class)
  public ApiResponse<Void> handleException(Exception e) {
    return ApiResponse.fail(ResultCode.NOT_FOUND);
  }
}

2.2 自定義ResponseBodyAdvice

通過實現 ResponseBodyAdvice 接口,可以對Controller返回的結果進行統一封裝。這種方式不需要修改每個Controller方法。

自定義注解(標注那些不需要處理的接口)

@Target({ ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface NoWrap {
}

自定義ResponseBodyAdvice

@RestControllerAdvice
public class GlobalResponseAdvice implements ResponseBodyAdvice<Object> {
  private final ObjectMapper objectMapper ;
  public GlobalResponseAdvice(ObjectMapper objectMapper) {
    this.objectMapper = objectMapper;
  }
  @Override
  public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
    return !returnType.hasMethodAnnotation(NoWrap.class);
  }
  @Override
  public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType,
      Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request,
      ServerHttpResponse response) {
    // 處理String類型特殊轉換
    if (body instanceof String) {
      try {
        return this.objectMapper.writeValueAsString(ApiResponse.success(body)) ;
      } catch (JsonProcessingException e) {
        System.err.printf("JSON序列化錯誤: %s%n", e.getMessage()) ;
        return body ;
      }
    }
    // 已封裝過的響應直接返回
    if (body instanceof ApiResponse) {
      return body ;
    }
    // 空響應
    if (body == null && returnType.getParameterType().equals(void.class)) {
      return ApiResponse.success();
    }
    return ApiResponse.success(body) ;
  }
}

Controller接口

@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
  return new User(id, "Pack") ;
}
@GetMapping("/query")
public String query() {
  return "查詢完成" ;
}

圖片圖片

圖片圖片

2.3 使用AOP技術

我們也可以使用AOP來攔截Controller方法的返回值,然后進行統一封裝。但是AOP技術的局限性非常大,我們首先要統一Controller接口的響應類型比如:使用ResponseEntity 作為統一方法返回類型。

@Aspect
@Component
public class ResponseAspect {
  @Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")
  public void controllerPointcut() {
  }
  @Around("controllerPointcut()")
  public Object handleResponse(ProceedingJoinPoint pjp) throws Throwable {
    Object result = pjp.proceed();
    if (result instanceof ResponseEntity<?> ret) {
      // 對ResponseEntity的body進行統一處理
      Object body = ApiResponse.success(ret.getBody()) ;
      return ResponseEntity.ok(body) ;
    }
    return result;
  }
}

Controller接口

@GetMapping("/{id}")
public ResponseEntity<?> getUser(@PathVariable Long id) {
  return ResponseEntity.ok(new User(id, "Pack")) ;
}

圖片

此種方式最不推薦的了,Controller接口都已經統一了ResponseEntity,那么我還搞個AOP做什么?

2.4 使用Filter

此種方式可行,但是也不推薦,復雜且易出錯,破壞流式響應。

@WebFilter("/way4/*")
public class ResponseContentFilter implements Filter {
  @Override
  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
      throws IOException, ServletException {
    HttpServletResponse response = (HttpServletResponse) resp;
    ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response);
    try {
      chain.doFilter(req, responseWrapper);
    } finally {
      // ...
    }
    String content = new String(responseWrapper.getContentAsByteArray(), "UTF-8") ;
    ObjectMapper mapper = new ObjectMapper();
    byte[] ret = mapper.writeValueAsBytes(ApiResponse.success(content)) ;
    response.getOutputStream().write(ret) ;
  }
}

Controller接口

@GetMapping("/{id}")
public ResponseEntity<?> getUser(@PathVariable Long id) {
  return ResponseEntity.ok(new User(id, "Pack")) ;
}

圖片圖片

通過Filter方式可能對那些 遺留系統改造 有用吧。

2.5 自定義HttpMessageConverter

通過自定義HttpMessageConverter方法提供了對響應處理過程的精細控制,特別適合需要完全定制響應格式的場景。

@Component
public class ResponseMessageConverter extends AbstractHttpMessageConverter<Object> {
  private final ObjectMapper objectMapper;
  public ResponseMessageConverter(ObjectMapper objectMapper) {
    super(MediaType.APPLICATION_JSON, MediaType.TEXT_HTML) ;
    this.objectMapper = objectMapper;
  }
  @Override
  protected boolean supports(Class<?> clazz) {
    // 支持所有類型,除了我們自己的ApiResponse和Void
    return !ApiResponse.class.isAssignableFrom(clazz) && !Void.TYPE.equals(clazz);
  }
  @Override
  protected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage)
      throws IOException, HttpMessageNotReadableException {
    // 只處理輸出,不處理輸入
    return null;
  }
  @Override
  protected void writeInternal(Object body, HttpOutputMessage outputMessage)
      throws IOException, HttpMessageNotWritableException {
    // 由于我們上面配置的能夠支持text/html,所以必須在這里配置Content-Type否則統一都會通過text/html響應這會出現亂碼問題
    outputMessage.getHeaders().add("Content-Type", "application/json;charset=utf-8");
    // 創建統一響應體
    ApiResponse<Object> response = ApiResponse.success(body);
    try {
      // 序列化響應體
      String json = objectMapper.writeValueAsString(response);
      // 寫入響應
      outputMessage.getBody().write(json.getBytes(StandardCharsets.UTF_8));
    } catch (JsonProcessingException e) {
      throw new HttpMessageNotWritableException("Error writing response", e);
    }
  }
}

Controller接口

@GetMapping("/{id}")
public User getUser(@PathVariable Long id) {
  return new User(id, "Pack") ;
}
@GetMapping("/query")
public String query() {
  return "查詢完成" ;
}

圖片圖片

圖片圖片

總結

該方案核心優勢在于細粒度控制與高性能:

  • 直接操作輸出流,性能最優
  • 精準控制封裝邏輯,通過supports()方法實現條件過濾
  • 完全掌控響應結構,支持特殊類型(如void/String)
  • 與Spring MVC原生機制無縫集成,不破壞現有流程
  • 避免全局包裝的過度處理,保持框架靈活性

適用于需要極致性能優化和深度定制響應格式的高要求場景。

責任編輯:武曉燕 來源: Springboot全家桶實戰案例
相關推薦

2024-08-01 09:10:03

2024-09-25 08:10:00

Spring后端

2025-06-06 08:28:56

2023-11-30 07:00:56

SpringBoot處理器

2025-03-31 08:39:55

2022-08-18 09:38:02

Spring跨域

2024-09-29 09:31:08

Spring前綴URL

2025-06-12 02:00:00

Spring簽到打卡

2025-02-13 00:34:22

Spring對象系統

2024-08-29 09:01:39

2025-06-17 07:37:53

2025-02-13 07:45:26

APISpringHTTP

2025-02-12 08:47:07

SpringAPI接口

2023-11-28 14:32:04

2025-08-08 01:55:00

SpringJSON日期

2025-05-30 08:11:30

2025-08-18 08:26:14

2025-01-09 08:36:05

2025-05-14 04:00:00

點贊
收藏

51CTO技術棧公眾號

亚洲色图清纯唯美| 日韩av网站在线观看| 亚洲成年人影院在线| 欧美日韩成人免费视频| eeuss影院www在线播放| 国产综合久久久久影院| 97精品在线观看| 日韩av片在线| 爱高潮www亚洲精品| 色综合天天综合狠狠| av不卡在线免费观看| 亚洲人妻一区二区三区| 精品一区二区国语对白| 欧美一区深夜视频| 免费又黄又爽又色的视频| 欧美精美视频| 精品少妇一区二区三区视频免付费 | 欧美精品一区二区三区精品| 日韩欧美中文字幕公布| 国产理论在线播放| ririsao久久精品一区| 中文字幕中文字幕一区| 欧美一区二区三区电影在线观看 | 日韩成人在线网站| 日韩精品视频网址| 福利精品一区| 色婷婷国产精品综合在线观看| 国产a级黄色大片| 免费在线看黄色| 国产日韩欧美亚洲| 你懂的网址一区二区三区| 亚洲免费成人网| 国产一区日韩二区欧美三区| 国产精品亚洲美女av网站| 久草手机在线视频| 一本色道久久综合亚洲精品不卡| 久久99热精品| tube国产麻豆| 亚洲自拍偷拍网| 日韩在线视频网| 欧美日韩生活片| 国内亚洲精品| 亚洲视频日韩精品| 色无极影院亚洲| 免费一区二区三区视频导航| 日韩高清人体午夜| 182在线视频| 欧美激情15p| 亚洲精品国产精品乱码不99按摩 | 久99久在线视频| 精品亚洲aⅴ无码一区二区三区| 精品一区二区三区亚洲| 在线成人高清不卡| 国产三级精品三级在线| 91成人app| 日韩写真欧美这视频| 国产成人强伦免费视频网站| 亚洲精品一区二区三区在线| 日韩欧美国产三级| 男人女人拔萝卜视频| 香蕉大人久久国产成人av| 亚洲精品一区二区三区香蕉| 岛国精品一区二区三区| 麻豆一区二区| 日韩高清av在线| 中文字幕在线观看免费高清| 日本欧美国产| 久久中国妇女中文字幕| 538精品在线观看| 韩日视频一区| 日本高清不卡在线| 人妻中文字幕一区二区三区| 韩日av一区二区| aa成人免费视频| 日韩有码电影| 国产精品蜜臀av| 粉嫩av一区二区三区天美传媒| 欧美一卡二卡| 一本大道久久a久久综合婷婷| 欧美伦理视频在线观看| 日本久久一区| 亚洲第一福利网站| 亚洲综合欧美综合| 欧美日一区二区在线观看| 26uuu亚洲伊人春色| 怡春院在线视频| 风间由美一区二区三区在线观看| 欧美日韩免费高清| 成人免费高清| 日韩欧美在线免费观看| 亚洲理论中文字幕| 偷拍视屏一区| 久久视频免费在线播放| 久久久久久91亚洲精品中文字幕| 久久精品国产一区二区三| 国产精品一区二区三区不卡| 欧美色18zzzzxxxxx| 亚洲精品亚洲人成人网 | 国产在线观看99| 日韩经典中文字幕一区| 91视频99| 尤物网在线观看| 午夜精品爽啪视频| 涩涩网站在线看| 久久99国产成人小视频| 色综合久久88| 亚洲综合一区中| 91蜜桃免费观看视频| 成年人黄色在线观看| 老司机成人影院| 欧美xfplay| 老司机精品免费视频| 欧美亚洲在线| 国产精品香蕉视屏| 黄色av网站在线播放| 在线观看日产精品| 老熟妇精品一区二区三区| 亚洲精品国产偷自在线观看| 国产精品久久久久久久久久久不卡| 亚洲精品国产手机| 亚洲精品视频免费观看| 国产一二三区av| 免费av一区| 98精品在线视频| 国产夫妻性生活视频| 亚洲欧洲另类国产综合| 91国产精品视频在线观看| 网友自拍一区| 欧美一区二区视频97| 四季av日韩精品一区| 一区二区三区波多野结衣在线观看 | 黄网站免费久久| 视频一区亚洲| 忘忧草在线www成人影院| 日韩高清人体午夜| 日本免费观看视| www.欧美日韩| 免费毛片网站在线观看| 成人激情自拍| 欧美精品www| 亚洲高清在线观看视频| 亚洲自拍偷拍麻豆| 少妇性l交大片7724com| 亚洲综合激情在线| 97久久天天综合色天天综合色hd| av激情在线| 欧美tickling网站挠脚心| 久久久久久久久久久97| 成人午夜视频在线| 国产曰肥老太婆无遮挡| 欧美巨大xxxx| 欧美一级视频在线观看| 东热在线免费视频| 欧美日韩中文字幕精品| 日韩国产第一页| 国产麻豆成人精品| 欧美狂野激情性xxxx在线观| 国产一级成人av| 日本乱人伦a精品| av在线日韩国产精品| 欧美另类z0zxhd电影| 午夜精品一区二区三区视频| 国产大片一区二区| 久激情内射婷内射蜜桃| 精品久久影视| 91精品国产综合久久香蕉的用户体验| av片哪里在线观看| 日韩大片在线观看视频| 国产在线一级片| 亚洲人成网站色在线观看| 美国黄色一级视频| 久久亚洲欧美| 黄色www在线观看| 国产三级精品三级在线观看国产| 国产suv精品一区二区三区88区| 福利在线播放| 日韩午夜在线观看| 女人十八岁毛片| 国产精品网站在线播放| av在线天堂网| 日韩精品一二三| 日韩一二区视频| 国内成人自拍| 岛国视频一区| 岛国一区二区| 97超级碰碰人国产在线观看| 婷婷在线视频| 亚洲国产黄色片| 色婷婷久久综合中文久久蜜桃av| 亚洲码国产岛国毛片在线| 久久福利小视频| 韩国v欧美v日本v亚洲v| 黄色一级视频片| 久久精品国内一区二区三区水蜜桃| 国产欧美丝袜| 亚洲精品66| 欧美一区二区视频97| 岛国成人毛片| 亚洲偷欧美偷国内偷| 午夜免费福利视频| 欧美日精品一区视频| 日韩精品视频免费播放| 亚洲欧洲av一区二区三区久久| 亚洲第九十七页| 国产激情视频一区二区三区欧美| 99视频在线免费| 亚洲经典三级| 一区二区三区四区免费观看| 精品黄色一级片| 国产一区二区不卡视频| 精品视频在线播放一区二区三区 | 国内精品久久久久久久| 精品美女在线观看视频在线观看| 亚洲欧洲自拍偷拍| 日本韩国免费观看| 日韩一区二区三区四区五区六区| 中文字幕av网站| 欧美午夜美女看片| 日韩av黄色片| 亚洲国产三级在线| 精品人妻伦九区久久aaa片| 国产欧美一区二区精品仙草咪 | 国产精品午夜在线| 新91视频在线观看| 久久综合久久鬼色中文字| 最新国产精品自拍| 国产一区二三区| 九九热免费在线观看| 日本成人在线电影网| 国产黄色特级片| 国产模特精品视频久久久久| 免费在线观看亚洲视频| 亚洲精品免费观看| 男人添女荫道口图片| 亚洲黄色大片| 免费一级特黄毛片| 日韩视频精品在线观看| 婷婷无套内射影院| 国产人成精品一区二区三| 亚洲美免无码中文字幕在线| 亚洲国产免费看| 伊人成色综合网| 国产日韩欧美一区二区三区在线观看| 2018日日夜夜| 亚洲综合日本| 亚洲国产精品毛片av不卡在线| 国产免费成人| 超碰影院在线观看| 奇米色777欧美一区二区| 国产一二三四在线视频| 久久av老司机精品网站导航| 天天影视色综合| 国产精品自在欧美一区| 免费看三级黄色片| 菠萝蜜视频在线观看一区| 精品中文字幕在线播放| 91麻豆国产福利在线观看| 在线免费观看成年人视频| 国产欧美一区在线| 免费看一级黄色| 一区二区三区四区在线| 国产大片aaa| 欧美午夜影院在线视频| 做爰无遮挡三级| 91精品国产免费| 五月婷婷激情在线| 国产亚洲欧美日韩一区二区| 日本在线视频观看| 欧美大学生性色视频| 55av亚洲| 国产精品高潮呻吟久久av无限| 欧美日韩破处视频| 国产99在线播放| 精品不卡一区| 裸体裸乳免费看| 一区二区日韩免费看| www.天天射.com| 国产成人综合亚洲91猫咪| 好吊一区二区三区视频| 中文字幕亚洲精品在线观看| 国产91av视频| 欧美制服丝袜第一页| www国产一区| 亚洲欧美在线播放| 直接在线观看的三级网址| 51久久精品夜色国产麻豆| 亚洲资源在线| 久久久久一区二区三区| 亚洲一区二区三区无吗| 国产亚洲天堂网| 国产精品一区久久久久| 成人片黄网站色大片免费毛片| 亚洲人精品午夜| 加勒比在线一区| 精品国产制服丝袜高跟| av午夜在线| 久久久久久中文| 久久久久伊人| 欧美一区激情视频在线观看| 好吊视频一区二区三区四区| 黄色永久免费网站| 91理论电影在线观看| 美女毛片在线观看| 欧美无砖专区一中文字| 亚欧在线观看视频| 欧美国产日韩二区| 24小时成人在线视频| 日韩欧美精品一区二区三区经典| 亚洲日本黄色| 中国男女全黄大片| 综合网在线视频| 亚洲综合成人av| 精品亚洲国产视频| av资源在线| 国产 高清 精品 在线 a| 欧美电影免费观看高清| 中文字幕第80页| 久久影院视频免费| 国产五月天婷婷| 日韩精品中文字幕一区二区三区| 视频免费一区| 国产精品久久中文| 奇米色欧美一区二区三区| 国产深夜男女无套内射| 国产.精品.日韩.另类.中文.在线.播放| 91ts人妖另类精品系列| 欧美亚洲尤物久久| 国产福利小视频在线| 日本一区二区三区在线播放| 精品一区二区男人吃奶| 精品无码国模私拍视频| 成年人午夜久久久| 国产午夜视频在线播放| 精品成人免费观看| 免费污视频在线| 福利精品视频| 99国产精品| 国产精品无码网站| 色婷婷精品大视频在线蜜桃视频| 欧美另类自拍| 国产成人久久精品| 成人看的视频| 欧美午夜aaaaaa免费视频| 中文乱码免费一区二区| 久草热在线观看| 日韩一区二区福利| 懂色av色香蕉一区二区蜜桃| 特级西西人体www高清大胆| 国产成人精品一区二区三区四区 | 三妻四妾的电影电视剧在线观看| 国产一区精品视频| 国产精品尤物| 人妻aⅴ无码一区二区三区| 91黄色免费看| 一区二区高清不卡| 亚洲伊人成综合成人网| 国产一区二区中文| 国产精品无码永久免费不卡| 91福利国产精品| 日韩免费网站| 北条麻妃高清一区| 99亚洲精品| 国产又粗又硬视频| 欧美一区二区私人影院日本| av影片在线| 色视频一区二区三区| 精品制服美女丁香| 久久午夜无码鲁丝片| 亚洲精品少妇网址| 国产成人77亚洲精品www| 日本免费黄色小视频| 99久久精品免费| 中文字幕你懂的| 欧美—级a级欧美特级ar全黄| 日韩大片在线免费观看| 欧美美女一级片| 亚洲国产精品麻豆| 成人精品一区二区三区校园激情 | 亚洲v天堂v手机在线| av污在线观看| 亚洲国产综合人成综合网站| 国产小视频免费在线网址| 91视频国产高清| 午夜在线视频观看日韩17c| 日本视频在线免费| 亚洲国产精品99久久| 99久久精品一区二区成人| 国产爆乳无码一区二区麻豆| 久久青草国产手机看片福利盒子| 一区二区国产欧美| 午夜精品www| 2023国产精品久久久精品双| 艳妇乳肉豪妇荡乳xxx| 欧美美女网站色| 午夜久久中文| 亚洲五码在线观看视频| 中文字幕不卡的av| 网站黄在线观看| 97人人模人人爽人人喊38tv| 青青国产91久久久久久|