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

RestTemplate 棄用!Spring 6.x+ 遷移 RestClient/WebClient 實操指南

開發(fā) 前端
Spring團隊已正式宣布,陪伴開發(fā)者15年的經(jīng)典HTTP客戶端RestTemplate,將在Spring Framework 7.0啟動棄用計劃,并在后續(xù)版本逐步移除。

引言

Spring團隊已正式宣布,陪伴開發(fā)者15年的經(jīng)典HTTP客戶端RestTemplate,將在Spring Framework 7.0啟動棄用計劃,并在后續(xù)版本逐步移除。

版本

時間

狀態(tài)

影響

Spring Framework 7.0

2025 年 11 月

宣布棄用計劃

無功能移除,僅官方標記棄用方向

Spring Framework 7.1

預(yù)計 2026 年 11 月

正式標記 @Deprecated

代碼中會出現(xiàn)廢棄警告,IDE 提示替代方案

Spring Framework 8.0

待定

徹底移除

無法再引入 RestTemplate 類,必須遷移

棄用原因

RestTemplate誕生于2009年(Spring 3.0),其設(shè)計已無法適配現(xiàn)代Java生態(tài),核心痛點可通過代碼直觀感受:

  • 超時配置失效:Spring 6.0后setReadTimeout方法標注@Deprecated,直接調(diào)用會觸發(fā)警告且無效果。
// Spring 6.0 前:通過 HttpRequestFactory 設(shè)置超時(已失效)
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory();
factory.setReadTimeout(5000); // 標注 @Deprecated(since = "6.0", forRemoval = true)
RestTemplate restTemplate = new RestTemplate(factory);
  • API冗余:新增功能依賴方法重載,導(dǎo)致同類方法大量重復(fù),例如發(fā)送POST請求:
// RestTemplate 發(fā)送 POST 的多種重載,參數(shù)順序易混淆
restTemplate.postForObject("url", request, Response.class);
restTemplate.postForEntity("url", request, Response.class);
restTemplate.postForLocation("url", request);
  • 異步支持薄弱:AsyncRestTemplate已被廢棄,依賴ListenableFuture處理并發(fā)時,代碼嵌套繁瑣:
// AsyncRestTemplate 已廢棄,不推薦使用
AsyncRestTemplate asyncRestTemplate = new AsyncRestTemplate();
asyncRestTemplate.postForObject("url", request, Response.class)
    .addCallback(
        response -> { /* 成功處理 */ },
        ex -> { /* 異常處理 */ }
    );

替代方案:RestClient 與 WebClient

RestClient:同步阻塞場景首選(替代 RestTemplate)

RestClient自Spring Framework 6.1引入,采用Fluent API設(shè)計,支持鏈式調(diào)用,且擴展性更強。

官方:https://docs.spring.io/spring-framework/reference/integration/rest-clients.html

案例 1:基礎(chǔ) GET 請求(帶路徑參數(shù) + 響應(yīng)解析)
// 1. 創(chuàng)建 RestClient 實例(推薦全局單例,可通過 @Bean 注入)
RestClient restClient = RestClient.create("https://api.example.com");

// 2. 發(fā)送 GET 請求,解析響應(yīng)為 User 實體
User user = restClient.get()
    .uri("/users/{id}", 1001) // 路徑參數(shù):{id} 對應(yīng)值 1001
    .header("Authorization", "Bearer token123") // 設(shè)置請求頭
    .accept(MediaType.APPLICATION_JSON) // 聲明接收格式
    .retrieve() // 執(zhí)行請求并獲取響應(yīng)
    .body(User.class); // 自動解析響應(yīng)體為 User 類(依賴 MappingJackson2HttpMessageConverter)

System.out.println("用戶姓名:" + user.getName());
案例 2:POST 請求(帶請求體 + 自定義異常處理)
// 1. 定義請求體(POJO 類)
@Data 
class UserCreateRequest {
    private String name;
    private Integer age;
}

// 2. 構(gòu)建請求體對象
UserCreateRequest request = new UserCreateRequest();
request.setName("張三");
request.setAge(25);

// 3. 發(fā)送 POST 請求,處理不同響應(yīng)碼(避免 RestTemplate 需捕獲 HttpClientErrorException 的問題)
try {
    User response = restClient.post()
        .uri("/users")
        .contentType(MediaType.APPLICATION_JSON) // 設(shè)置請求體格式
        .body(request) // 傳入請求體對象(自動序列化為 JSON)
        .retrieve()
        // 自定義 4xx 客戶端錯誤處理
        .onStatus(HttpStatusCode::is4xxClientError, (req, resp) -> {
            String errorMsg = resp.getBodyAsString().block(); // 讀取錯誤響應(yīng)體
            throw new RuntimeException("客戶端錯誤[" + resp.getStatusCode() + "]:" + errorMsg);
        })
        // 自定義 5xx 服務(wù)端錯誤處理
        .onStatus(HttpStatusCode::is5xxServerError, (req, resp) -> {
            throw new RuntimeException("服務(wù)端錯誤:" + resp.getStatusCode());
        })
        .body(User.class); // 解析成功響應(yīng)為 User 實體

    System.out.println("創(chuàng)建用戶 ID:" + response.getId());
} catch (RuntimeException e) {
    e.printStackTrace(); // 統(tǒng)一捕獲自定義異常
}
案例 3:超時配置(替代 RestTemplate 失效的 setReadTimeout)
// 1. 配置 Socket 超時(讀取超時 5 秒,連接超時 3 秒)
SocketConfig socketConfig = SocketConfig.custom()
    .setSoTimeout(5000) // 讀取超時(對應(yīng) RestTemplate 的 setReadTimeout)
    .build();

// 2. 配置連接管理器(支持連接池、連接超時等)
PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
    .setDefaultSocketConfig(socketConfig)
    .setConnectionTimeToLive(3000, java.util.concurrent.TimeUnit.MILLISECONDS) // 連接超時
    .build();

// 3. 構(gòu)建 Apache HttpClient 實例
HttpClient httpClient = HttpClientBuilder.create()
    .setConnectionManager(connectionManager)
    .build();

// 4. 基于 HttpClient 創(chuàng)建 RestClient(注入自定義請求工廠)
RestClient restClient = RestClient.builder()
    .requestFactory(new HttpComponentsClientHttpRequestFactory(httpClient)) // 關(guān)聯(lián) HttpClient 配置
    .baseUrl("https://api.example.com")
    .build();

// 后續(xù)使用 restClient 發(fā)送請求,已包含超時配置
try {
    User user = restClient.get()
        .uri("/users/1001")
        .retrieve()
        .body(User.class);
} catch (Exception e) {
    // 超時會拋出 org.springframework.web.client.ResourceAccessException
    System.err.println("請求超時:" + e.getMessage());
}

WebClient:異步非阻塞 / 流式場景首選

WebClient基于Reactive Streams設(shè)計,適合高并發(fā)、異步或流式處理(如SSE)場景,與Spring WebFlux無縫整合。

官方:https://docs.spring.io/spring-framework/reference/web/webflux-webclient.html

案例 1:異步 GET 請求(非阻塞處理)
// 1. 創(chuàng)建 WebClient 實例(推薦全局單例)
WebClient webClient = WebClient.create("https://api.example.com");

// 2. 異步發(fā)送 GET 請求(返回 Mono<User>,非阻塞,不阻塞主線程)
Mono<User> userMono = webClient.get()
    .uri("/users/{id}", 1001)
    .header("Authorization", "Bearer token123")
    .retrieve()
    .bodyToMono(User.class); // 響應(yīng)體轉(zhuǎn)為 Mono(單值響應(yīng),適合單個對象)

// 3. 訂閱結(jié)果(異步處理,主線程繼續(xù)執(zhí)行其他邏輯)
userMono.subscribe(
    user -> System.out.println("異步獲取用戶:" + user.getName()), // 成功回調(diào)
    ex -> System.err.println("異常:" + ex.getMessage()), // 異常回調(diào)
    () -> System.out.println("請求完成(無返回值時觸發(fā))") // 完成回調(diào)
);

// 主線程無需等待,直接執(zhí)行后續(xù)代碼(非阻塞特性體現(xiàn))
System.out.println("主線程繼續(xù)執(zhí)行其他任務(wù)...");
案例 2:流式處理 SSE(Server-Sent Events)
// 1. 定義 SSE 事件實體
@Data
class SseEvent {
    private String eventType; // 事件類型(如 "log"、"notice")
    private String content;   // 事件內(nèi)容
    private Long timestamp;   // 時間戳
}

// 2. 發(fā)送 SSE 請求,獲取流式響應(yīng)(返回 Flux<SseEvent>,多值響應(yīng))
Flux<SseEvent> eventFlux = webClient.get()
    .uri("/sse/real-time-logs")
    .accept(MediaType.TEXT_EVENT_STREAM) // 必須聲明 SSE 格式
    .retrieve()
    .bodyToFlux(SseEvent.class); // 流式響應(yīng)轉(zhuǎn)為 Flux(多值響應(yīng),持續(xù)接收)

// 3. 訂閱流式數(shù)據(jù)(持續(xù)接收服務(wù)器推送的事件)
eventFlux.subscribe(
    event -> {
        // 處理每一條 SSE 事件
        System.out.printf("[%d] %s: %s%n", 
            event.getTimestamp(), event.getEventType(), event.getContent());
    },
    ex -> System.err.println("SSE 連接異常:" + ex.getMessage()), // 連接異常處理
    () -> System.out.println("SSE 連接被服務(wù)器關(guān)閉") // 連接關(guān)閉處理
);

老項目平滑遷移實操

// 老項目已有的 RestTemplate 實例(可能包含自定義配置)
RestTemplate oldRestTemplate = new RestTemplate();
// 老項目原有配置:添加日志攔截器
oldRestTemplate.setInterceptors(Collections.singletonList(new LoggingInterceptor()));
// 老項目原有配置:自定義消息轉(zhuǎn)換器(如支持 XML 解析)
oldRestTemplate.getMessageConverters().add(new MappingJackson2XmlHttpMessageConverter());

// 1. 用 RestClient 包裝老 RestTemplate,復(fù)用所有配置(零侵入)
RestClient restClient = RestClient.create(oldRestTemplate);

// 2. 新開發(fā)功能使用 RestClient,老功能繼續(xù)用 oldRestTemplate
// 新功能:RestClient 調(diào)用(享受 Fluent API 優(yōu)勢)
User newUser = restClient.get()
    .uri("/users/1002")
    .retrieve()
    .body(User.class);

// 老功能:繼續(xù)使用 oldRestTemplate(暫不修改,避免風險)
User oldUser = oldRestTemplate.getForObject("https://api.example.com/users/1001", User.class);

責任編輯:武曉燕 來源: 一安未來
相關(guān)推薦

2024-09-30 10:11:04

2025-07-21 07:30:09

2023-12-11 08:15:53

Spring6遠程接口

2024-03-11 09:32:55

WebClientSpringHTTP

2020-12-07 11:22:09

私域流量運營

2023-12-28 08:00:00

數(shù)據(jù)庫人工智能

2023-11-28 16:35:40

MongoDB遷移Oplog

2013-08-12 10:19:04

虛擬網(wǎng)絡(luò)設(shè)備虛擬化方案虛擬化安全

2025-11-06 04:00:00

DeepSeekAutoDLWeb UI

2018-03-12 06:30:05

Python數(shù)據(jù)科學編程

2022-02-22 14:07:07

框架配置類Spring

2023-10-23 15:38:12

Spring 5開發(fā)

2010-05-20 13:11:04

MySQL GRANT

2010-01-06 10:38:16

Linux安裝JDK

2025-10-11 02:11:00

項目Easysearch開源工具

2010-04-12 09:36:29

Oacle merge

2019-04-02 14:04:34

虛擬現(xiàn)實VR設(shè)計

2022-07-11 13:43:51

Prometheus監(jiān)控

2025-09-24 07:23:01

2010-05-10 17:00:53

Oracle死鎖進程
點贊
收藏

51CTO技術(shù)棧公眾號

老司机午夜av| 天天爽天天狠久久久| 亚洲精品www久久久久久| 五月国产精品| 欧美日韩国产大片| av在线观看地址| 女人天堂在线| 国产一区二区三区蝌蚪| 97精品国产97久久久久久| 亚洲精品国产91| 国产午夜精品一区在线观看| 香蕉影视欧美成人| 亚洲一区二区免费视频软件合集| 性欧美18一19性猛交| 久久性色av| 九九热99久久久国产盗摄| 强伦人妻一区二区三区| 日韩欧美久久| 欧美日韩中文国产| 人人妻人人添人人爽欧美一区| h视频网站在线观看| 成人高清视频在线| 成人综合网网址| 亚洲乱码国产乱码精品| 亚洲高清激情| 欧美日本啪啪无遮挡网站| 在线视频第一页| 国产精品一区二区三区美女| 欧美一区午夜精品| 中文字幕第80页| 日韩深夜视频| 天天av天天翘天天综合网 | www日本在线| 免费在线看成人av| 国产91在线播放精品91| 日本一二三区不卡| 欧美1区视频| 久久久精品一区二区三区| 国产三级黄色片| 欧美精美视频| 国产婷婷成人久久av免费高清| 无码人妻一区二区三区精品视频| 日本精品久久| 欧美综合视频在线观看| 欧美xxxxx在线视频| 牛牛精品一区二区| 污片在线观看一区二区| 精品无码国模私拍视频| 久久免费电影| 一区二区三区四区蜜桃| 一二三四中文字幕| 羞羞的视频在线观看| 依依成人综合视频| 男人添女人下部视频免费| 在线视频观看国产| 一区二区三区国产| 亚洲精品蜜桃久久久久久| 免费污视频在线观看| 香蕉影视欧美成人| 亚洲欧洲日产国码无码久久99| av资源中文在线天堂| 精品久久久久久久久中文字幕| 亚洲不卡中文字幕无码| 三妻四妾的电影电视剧在线观看| 欧美香蕉大胸在线视频观看| 免费无码av片在线观看| 三级成人黄色影院| 欧美色网站导航| 日韩成人精品视频在线观看| 国产精品毛片aⅴ一区二区三区| 欧美一区二区三区免费视频| 国产精品熟妇一区二区三区四区| 第四色在线一区二区| 日韩电影在线观看中文字幕| www.av天天| 999久久久免费精品国产| 久久久国产91| 国产精品7777777| 久久中文在线| 成人两性免费视频| 好吊色一区二区| 久久久午夜精品理论片中文字幕| 日韩区国产区| 超碰公开在线| 欧美性xxxxx极品| 最新天堂在线视频| 91嫩草精品| 亚洲无av在线中文字幕| 草视频在线观看| 亚洲综合日韩| 91精品在线播放| 午夜视频在线免费播放| 欧美激情一区二区三区全黄| 国产激情在线看| 成人日韩在线| 欧美一区二区三区视频在线观看| 少妇精品无码一区二区三区| 欧美中文字幕一区二区| 欧美激情久久久久久| 黄色网址中文字幕| 成人午夜激情在线| 一区二区免费在线观看| 中文在线资源| 日韩一区二区高清| 女人十八毛片嫩草av| 韩国欧美一区| 国产精品久久99久久| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 国产一区二区三区久久久| 国产高清精品一区二区三区| 99视频在线观看地址| 亚洲国产精品精华液网站| 久久国产精品国产精品| 欧美电影在线观看免费| 美日韩精品免费视频| 麻豆成人免费视频| av中文字幕在线不卡| 99re99热| 国产精品99| 亚洲美女性视频| 久久久久免费看| 国内不卡的二区三区中文字幕| 麻豆精品传媒视频| 日本乱理伦在线| 6080yy午夜一二三区久久| 3d动漫精品啪啪一区二区下载| 欧美午夜不卡| 91老司机精品视频| 在线免费观看的av网站| 色呦呦国产精品| 欧美黑人欧美精品刺激| 亚洲精品日本| 国外成人在线视频网站| 免费网站在线观看人| 日韩一级黄色大片| 成人免费精品动漫网站| 麻豆国产精品一区二区三区| 日韩一区二区电影在线观看| 天天综合网站| 亚洲三级黄色在线观看| 久久精品一二区| 91在线观看视频| 欧美三级在线观看视频| 另类春色校园亚洲| 久久琪琪电影院| 日本黄色不卡视频| 黄色成人在线免费| 国产吞精囗交久久久| 中日韩视频在线观看| 九色91视频| 自拍一区在线观看| 精品一区二区三区四区在线| xxxx.国产| 久久久久久久久久看片| 99草草国产熟女视频在线| 国产欧美一区二区精品久久久| 日本亚洲欧洲色α| av资源种子在线观看| 欧美日韩另类一区| 午夜剧场免费在线观看| 国产成人在线免费观看| 日韩中字在线观看| 米奇777超碰欧美日韩亚洲| 日韩av手机在线| 成人影视在线播放| 在线播放中文字幕一区| 日韩一级片av| 成人精品国产一区二区4080| 亚洲色成人一区二区三区小说| 九九久久电影| 成人日韩在线电影| wwww亚洲| 亚洲人成免费电影| 国产一区二区三区三州| 一区二区三区91| 中文字幕在线观看的网站| 三级影片在线观看欧美日韩一区二区 | 一区二区三区视频播放| 97视频网站入口| 国产福利第一视频在线播放| 91精品国模一区二区三区| 久久亚洲成人av| 国产日产欧美一区二区视频| 日本一本在线视频| 性色av一区二区怡红| 亚洲制服中文| 牛牛精品成人免费视频| 国产精品亚洲网站| 超碰在线视屏| 日韩中文理论片| 天天操天天干天天爽| 欧美日韩专区在线| 国产精品111| 国产精品免费视频观看| 国产精品亚洲一区二区无码| 日韩电影在线观看电影| 欧美大黑帍在线播放| 精品国产91乱码一区二区三区四区| 95av在线视频| 欧美黑人巨大xxxxx| 欧美二区乱c黑人| 97电影在线看视频| 亚洲激情视频网| 国产片在线播放| 欧美亚洲综合网| 男女视频免费看| 亚洲日本va在线观看| 美女被到爽高潮视频| 国产成人av在线影院| 中文字幕有码av| 久久99伊人| 99热久久这里只有精品| 91综合久久| 日本一区二区在线视频| 成人在线超碰| 成人网在线观看| av有声小说一区二区三区| 992tv成人免费影院| 91最新在线视频| 色多多国产成人永久免费网站| 三级在线播放| 精品久久久久99| 国产强被迫伦姧在线观看无码| 欧美综合久久久| 久久久精品视频网站| 午夜欧美在线一二页| 日本精品在线免费观看| 国产精品久久久久精k8| 中国女人特级毛片| 久久精品夜色噜噜亚洲a∨| 国产精品第七页| 不卡一区二区三区四区| 人妻巨大乳一二三区| 国产真实精品久久二三区| 欧美成人黄色网址| 日本va欧美va精品发布| 日本a√在线观看| 日韩极品在线观看| 成人在线观看a| 久久综合伊人| caoporn超碰97| 免费观看成人av| 免费在线观看污网站| 久久电影网电视剧免费观看| 亚洲少妇久久久| 蜜臀av国产精品久久久久| 冲田杏梨av在线| 久久精品国产免费| 久久久久久蜜桃一区二区| 久久国产婷婷国产香蕉| 亚洲一区二区三区观看| 国产精品影视在线观看| 99免费观看视频| 91欧美一区二区| 久久久久久亚洲中文字幕无码| 国产日韩欧美精品一区| 污污视频网站在线免费观看| 亚洲欧洲精品一区二区三区不卡| 九九精品视频免费| 一区二区三区日韩在线观看| 久久影院一区二区| 五月天国产精品| 无码人妻精品一区二区三区蜜桃91| 色婷婷av一区二区三区大白胸 | www.综合网.com| 91精品国产乱码久久久久久久久| 性国裸体高清亚洲| 国产精品video| 日韩精品一区二区三区中文在线| 成人三级视频在线观看一区二区| 全国精品免费看| 色一情一乱一伦一区二区三区丨| 欧美freesextv| 男的插女的下面视频| 香蕉精品999视频一区二区| 精品久久久噜噜噜噜久久图片| 久久成人免费网| 国内精品免费视频| 久久伊人蜜桃av一区二区| 国产一区第一页| 亚洲v中文字幕| 一区二区乱子伦在线播放| 日韩欧美国产高清| 国模吧精品人体gogo| 久久精品中文字幕免费mv| 国模私拍一区二区国模曼安| 国产精品中文字幕久久久| 一区二区三区四区精品视频| 欧美人xxxxx| 欧美精品首页| 男女爽爽爽视频| 成人精品国产一区二区4080| 91精品国自产在线| 亚洲午夜久久久久中文字幕久| 日韩综合在线观看| 欧美r级电影在线观看| 成人高清网站| 欧美黑人狂野猛交老妇| 成人一级视频| 久久99蜜桃综合影院免费观看| 天天射成人网| 国产一区二区视频免费在线观看| 国产精品99久| 精品手机在线视频| 日韩欧美大尺度| 韩国av永久免费| 超薄丝袜一区二区| 日韩色淫视频| 久久99热只有频精品91密拍| 中文一区一区三区免费在线观看| 国产91对白刺激露脸在线观看| 国产精品亚洲第一区在线暖暖韩国| 亚洲性猛交xxxx乱大交| 午夜电影久久久| 亚洲第一天堂在线观看| 日韩在线观看免费高清| 亚洲成人短视频| 久久久久一区二区三区| 亚洲第一在线| 日本人妻一区二区三区| 亚洲人成小说网站色在线| 亚洲综合精品视频| 一本色道久久88亚洲综合88| 日韩影院在线| 国外成人在线视频网站| 欧美先锋影音| 色欲无码人妻久久精品| 国产精品不卡一区| 一区二区三区播放| 中文日韩在线观看| 成人va天堂| 日本福利一区二区三区| 久久综合导航| 亚洲精品国产精品国自产网站| 欧美日韩午夜剧场| 性感美女福利视频| 91精品国产777在线观看| 都市激情亚洲| 狠狠97人人婷婷五月| www.一区二区| 国产原创视频在线| 亚洲久久久久久久久久| 亚洲综合电影| 日韩视频精品| 青青草国产成人av片免费| 国产又粗又黄又猛| 欧美日韩精品欧美日韩精品 | 人妻精品一区一区三区蜜桃91| 欧美激情国产精品| 超碰成人福利| 欧美激情 国产精品| 91丨porny丨首页| 精产国品一区二区| 亚洲香蕉av在线一区二区三区| 日韩欧美精品电影| 夜夜爽99久久国产综合精品女不卡 | 国产综合色香蕉精品| 99精品在线免费在线观看| 三区视频在线观看| 一区二区三区在线免费| 免费看黄网站在线观看| 欧美在线免费视频| 精品美女在线视频| 亚洲精品免费一区亚洲精品免费精品一区| 亚洲欧美在线观看| 国模无码一区二区三区| 日韩av免费看网站| 99久久综合| 日韩女优在线视频| 色综合久久99| 九色porny在线| 国产欧美丝袜| 日本不卡视频在线观看| 免费看一级大片| 日韩电影第一页| 日韩伦理一区二区| 精品人妻少妇一区二区| 久久久综合激的五月天| 一级黄色免费片| 久久久久久国产| 国产亚洲电影| 熟妇女人妻丰满少妇中文字幕| 午夜视频一区二区| 欧美三级黄网| 蜜桃视频成人| 国产一区二区三区不卡在线观看| 久久精品国产亚洲av高清色欲 | 欧美美女bb生活片| a国产在线视频| 色撸撸在线观看| 久久嫩草精品久久久精品一| 国产精品丝袜黑色高跟鞋| 欧美夜福利tv在线| 欧美精品18| a天堂中文字幕| 亚洲成人精品视频在线观看| 久久久免费人体| 波多野结衣家庭教师在线| 亚洲图片欧美激情| 久久天堂电影|