国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

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

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

引言

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

版本

時(shí)間

狀態(tài)

影響

Spring Framework 7.0

2025 年 11 月

宣布棄用計(jì)劃

無(wú)功能移除,僅官方標(biāo)記棄用方向

Spring Framework 7.1

預(yù)計(jì) 2026 年 11 月

正式標(biāo)記 @Deprecated

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

Spring Framework 8.0

待定

徹底移除

無(wú)法再引入 RestTemplate 類,必須遷移

棄用原因

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

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

替代方案:RestClient 與 WebClient

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

RestClient自Spring Framework 6.1引入,采用Fluent API設(shè)計(jì),支持鏈?zhǔn)秸{(diào)用,且擴(kuò)展性更強(qiáng)。

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

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

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

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

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

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

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

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

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

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

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

WebClient:異步非阻塞 / 流式場(chǎng)景首選

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

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

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

// 2. 異步發(fā)送 GET 請(qǐng)求(返回 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),適合單個(gè)對(duì)象)

// 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("請(qǐng)求完成(無(wú)返回值時(shí)觸發(fā))") // 完成回調(diào)
);

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

// 2. 發(fā)送 SSE 請(qǐng)求,獲取流式響應(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)閉處理
);

老項(xiàng)目平滑遷移實(shí)操

// 老項(xiàng)目已有的 RestTemplate 實(shí)例(可能包含自定義配置)
RestTemplate oldRestTemplate = new RestTemplate();
// 老項(xiàng)目原有配置:添加日志攔截器
oldRestTemplate.setInterceptors(Collections.singletonList(new LoggingInterceptor()));
// 老項(xiàng)目原有配置:自定義消息轉(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)勢(shì))
User newUser = restClient.get()
    .uri("/users/1002")
    .retrieve()
    .body(User.class);

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

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

2024-09-30 10:11:04

2025-07-21 07:30:09

2023-12-11 08:15:53

Spring6遠(yuǎn)程接口

2024-03-11 09:32:55

WebClientSpringHTTP

2023-12-28 08:00:00

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

2020-12-07 11:22:09

私域流量運(yùn)營(yíng)

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ù)科學(xué)編程

2022-02-22 14:07:07

框架配置類Spring

2023-10-23 15:38:12

Spring 5開發(fā)

2010-05-20 13:11:04

MySQL GRANT

2025-10-11 02:11:00

項(xiàng)目Easysearch開源工具

2010-01-06 10:38:16

Linux安裝JDK

2010-04-12 09:36:29

Oacle merge

2019-04-02 14:04:34

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

2022-07-11 13:43:51

Prometheus監(jiān)控

2025-09-24 07:23:01

2010-04-09 10:13:13

Oracle數(shù)據(jù)字典
點(diǎn)贊
收藏

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

91麻豆精品国产91久久久久推荐资源| 激情图区综合网| 日韩欧美久久久| 国产视频青青| 成人国产视频在线观看| 国产日韩欧美综合精品| 久久影视三级福利片| 中文字幕国产亚洲2019| 蜜桃视频网站在线| 色狠狠色噜噜噜综合网| 蜜桃臀av在线| 亚洲自拍欧美精品| 男女羞羞视频教学| 国产色一区二区| 成年在线观看视频| 久久成人一区| 精品视频一区在线| 一区二区不卡| 91在线高清免费观看| 日韩夫妻性生活xx| 国产精品日日摸夜夜添夜夜av| 91精品国产乱码久久久竹菊| 久久精品一本久久99精品| 四虎影视4hu4虎成人| 亚洲欧洲一区二区三区在线观看| 国产美女福利在线观看| 亚洲精品一区在线观看| 日本h片在线观看| 欧美一级片免费看| 欧美性受ⅹ╳╳╳黑人a性爽| 欧美一区二区三区人| 日本三级视频在线播放| 在线91免费看| av日韩国产| 国产亚洲精品日韩| jizz亚洲女人高潮大叫| 久久精品国产一区二区三区| 日韩专区视频| 欧美国产日韩一区二区三区| 成人h动漫免费观看网站| 久久久亚洲福利精品午夜| 牛牛影视一区二区三区免费看| fc2ppv国产精品久久| 在线看日本不卡| 天天色 色综合| 成人看片在线| 后进极品白嫩翘臀在线播放| 精品magnet| 日本视频一二区| 亚洲国产乱码最新视频 | 岛国一区二区三区| 免费在线观看亚洲视频| 国产欧美一二三区| 国产主播色在线| 欧美性高潮在线| 在线免费观看污| 久久精视频免费在线久久完整在线看| 哺乳一区二区三区中文视频| 国产精品久久久久久超碰| 午夜电影亚洲| 特级西西444| 自拍偷拍欧美精品| 国产激情小视频在线| 最近2019年好看中文字幕视频| 欧美在线导航| 欧美日韩视频在线一区二区观看视频| 99国产精品久久| 日本五码在线| 亚洲欧美日韩精品久久亚洲区| 成人h动漫免费观看网站| 亚洲最大的免费| 老司机精品视频一区二区三区| 美女网站视频黄色| 色婷婷亚洲精品| 人人精品久久| 91在线视频免费| 韩国av一区二区三区四区| 理论片播放午夜国外| 精品裸体舞一区二区三区| 欧美18xxxx| 亚洲一区二区三区精品视频| 最新高清无码专区| sm捆绑调教国产免费网站在线观看| 高清欧美电影在线| 看电视剧不卡顿的网站| 在线观看国产v片| 中国china体内裑精亚洲片| 久久久久久久久久久9不雅视频| 国产1区2区3区中文字幕| 精品久久中文字幕久久av| 123成人网| 激情一区二区三区| 国产精品久久久久久久久免费樱桃| 日本中文在线| 奇门遁甲1982国语版免费观看高清| 成人不卡视频| 亚洲尤物视频网| 成人一区视频| 欧美性xxxx69| 欧美电影在线观看完整版| 午夜精品久久久久久久| 久草.com| 中文字幕中文字幕在线十八区| 久久天天躁夜夜躁狠狠躁2022| 欧美成人午夜| 91最新在线观看| 日韩欧美www| 欧美激情另类| 性chinese极品按摩| 精品国产免费视频| 成人同人动漫免费观看| 国产男女无遮挡| 亚洲成人网在线观看| 欧美国产三级| 免费女人黄页| 亚洲欧美在线磁力| 老牛嫩草一区二区三区日本| 天堂资源在线观看| 欧美激情视频网站| 国产91对白在线观看九色| 国产一二区在线| 51国偷自产一区二区三区的来源| 国产日本欧洲亚洲| 中文字幕不卡三区视频| 欧美日韩综合久久| 精品视频在线看| 亚洲字幕久久| 久草电影在线| 欧洲亚洲妇女av| 国产蜜臀97一区二区三区| 99riav视频一区二区| 一区二区不卡视频| 日韩欧美高清在线| 国产亚洲成人一区| 色视频在线播放| 国产成人极品视频| 亚洲欧洲另类国产综合| 亚洲一二三区视频| 成人在线观看黄| 中文字幕久精品免费视频| 国内精品视频666| 99riav视频在线观看| 日韩欧美电影一区二区| 91.成人天堂一区| 免费日韩一区二区| caoporn-草棚在线视频最| 一本一生久久a久久精品综合蜜| 6080午夜不卡| 日韩国产在线一| 日本三级一区| 国产av熟女一区二区三区| 一本色道久久88综合日韩精品| 不卡的av电影在线观看| 成人污污视频| 麻豆免费网站| 51精品国产人成在线观看| 欧美另类久久久品| 日本欧美在线看| 向日葵视频成人app网址| 男人日女人bb视频| 青青久久av北条麻妃海外网| 午夜久久福利影院| 亚洲一区国产| 在线能看的av网址| 色诱视频在线观看| 国产精品久久久久福利| 精品视频在线看| 另类小说一区二区三区| 本网站久久精品| 国产一伦一伦一伦| 亚洲综合小说区| 精品人在线二区三区| 成av人片一区二区| 精品一区二区三| www久久日com| 国产96在线 | 亚洲| 国产成人精品久久久| 5858s免费视频成人| 国产成人精品免费| 精品中文字幕一区二区三区av| 粗大的内捧猛烈进出在线视频| 亚洲欧美国产中文| 欧美理论电影在线观看| 亚洲三级电影网站| 日本视频在线一区| 狠狠色狠狠色综合日日tαg| 久久婷婷蜜乳一本欲蜜臀| 久草资源在线观看| 先锋成人影音| 尤物av无码色av无码| 91系列在线播放| 在线电影院国产精品| 成人综合婷婷国产精品久久免费| 91精品国产丝袜白色高跟鞋| 久久综合伊人77777麻豆| gogo人体高清视频| 日韩在线麻豆| 男女性色大片免费观看一区二区 | 亚洲国产精品久久久久蝴蝶传媒| 91精品观看|