java實現在工具類中注入其他對象方式

方案1:

@Slf4j
@Component
public class ChatdocApiClient {@Value("${chatdoc.app-id}")private String appId;@Value("${chatdoc.secret}")private String secret;@Value("${chatdoc.domain}")private String domain;private final RestTemplate restTemplate = new RestTemplate();/*** 文件上傳*/public Map<String, Object> uploadFile(MultipartFile file, String url, String fileName, String fileType, String parseType, Boolean stepByStep, String callbackUrl, String extend) throws IOException {String apiUrl = "https://" + domain + "/openapi/v1/file/upload";HttpHeaders headers = buildAuthHeaders();headers.setContentType(MediaType.MULTIPART_FORM_DATA);MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();if (file != null) {body.add("file", file.getResource());}if (url != null) body.add("url", url);if (fileName != null) body.add("fileName", fileName);if (fileType != null) body.add("fileType", fileType);if (parseType != null) body.add("parseType", parseType);if (stepByStep != null) body.add("stepByStep", stepByStep);if (callbackUrl != null) body.add("callbackUrl", callbackUrl);if (extend != null) body.add("extend", extend);HttpEntity<MultiValueMap<String, Object>> request = new HttpEntity<>(body, headers);try {log.info("[Chatdoc] 上傳文件: {}", fileName);ResponseEntity<Map> resp = restTemplate.postForEntity(apiUrl, request, Map.class);return resp.getBody();} catch (RestClientException e) {log.error("[Chatdoc] 文件上傳失敗", e);throw new ChatdocApiException("文件上傳失敗: " + e.getMessage(), e);}}

方案2:

1. 構造函數注入(推薦)

這是 Spring 官方推薦的方式,通過構造函數將 RestTemplate 注入到類中,清晰展示類的依賴關系。

@Slf4j
@Component
public class ChatdocApiClient {@Value("${chatdoc.app-id}")private String appId;@Value("${chatdoc.secret}")private String secret;@Value("${chatdoc.domain}")private String domain;private final RestTemplate restTemplate;  // 不再直接new// 構造函數注入RestTemplatepublic ChatdocApiClient(RestTemplate restTemplate) {this.restTemplate = restTemplate;}// 其他代碼不變...
}

注意:使用這種方式需要先在 Spring 容器中定義 RestTemplate 的 Bean

從圖中報錯 “Could not autowire. No beans of ‘RestTemplate’ type found.” 可知,問題是 Spring 容器中找不到 RestTemplate 類型的 Bean,因為沒有配置 RestTemplate 到 Spring 容器。

解決方法:在項目的配置類(一般用 @Configuration 標注)中添加如下代碼,將 RestTemplate 注冊為 Bean ,這樣就能注入了:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class AppConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

2. 字段注入(@Autowired)

通過 @Autowired 注解直接在字段上注入 RestTemplate,代碼更簡潔但依賴關系不夠直觀。

@Slf4j
@Component
public class ChatdocApiClient {@Value("${chatdoc.app-id}")private String appId;@Value("${chatdoc.secret}")private String secret;@Value("${chatdoc.domain}")private String domain;@Autowired  // 字段注入private RestTemplate restTemplate;// 其他代碼不變...
}

3. Setter 方法注入

通過 Setter 方法注入 RestTemplate,適合需要在注入后做額外處理的場景。

@Slf4j
@Component
public class ChatdocApiClient {@Value("${chatdoc.app-id}")private String appId;@Value("${chatdoc.secret}")private String secret;@Value("${chatdoc.domain}")private String domain;private RestTemplate restTemplate;// Setter方法注入@Autowiredpublic void setRestTemplate(RestTemplate restTemplate) {this.restTemplate = restTemplate;// 可以在這里添加初始化邏輯}// 其他代碼不變...
}

4. 手動從 Spring 上下文獲取(特殊場景)

通過 ApplicationContext 手動獲取 RestTemplate,適合非 Spring 管理的類或特殊場景(不推薦常規使用)。

@Slf4j
@Component
public class ChatdocApiClient implements ApplicationContextAware {@Value("${chatdoc.app-id}")private String appId;@Value("${chatdoc.secret}")private String secret;@Value("${chatdoc.domain}")private String domain;private RestTemplate restTemplate;private static ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {context = applicationContext;}// 初始化時獲取RestTemplate@PostConstructpublic void init() {this.restTemplate = context.getBean(RestTemplate.class);}// 其他代碼不變...
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93169.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93169.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93169.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

electron中IPC 渲染進程與主進程通信方法解析

electron中ipcRenderer.invoke、ipcRenderer.on、ipcRenderer.send、ipcRenderer.sendSync作用與區別 IPC 渲染進程與主進程通信方法解析 ipcRenderer 的這幾個方法作用不完全相同&#xff0c;它們適用于不同的通信場景&#xff0c;核心區別在于通信方向、是否需要響應以及同步…

epoll_event 事件類型詳解

epoll_event 事件類型詳解 epoll_event 是 Linux epoll I/O 多路復用機制的核心結構體&#xff0c;其中的事件類型決定了 epoll 監控的行為和觸發條件。以下是各種事件類型的詳細解析&#xff1a; epoll_event 結構體 #include <sys/epoll.h>typedef union epoll_data {v…

設計自己的小傳輸協議 導論與概念

設計自己的小傳輸協議 導論與概念 1&#xff1a;聊一聊協議頭設計 ? 早在《TCP/IP詳解》中的第一句話中&#xff0c;我們就知道協議的含義是這樣的&#xff1a;協議是通信雙方共同遵守的一套規則&#xff0c;提供格式定義、語義解釋等&#xff0c;使不同設備或軟件能夠正確交…

iOS —— 天氣預報仿寫總結

在iOS中&#xff0c;最常見的網絡請求方式是NSURLSession&#xff0c;它是蘋果推薦的現代API&#xff0c;簡單安全且易于拓展。一次完整的網絡請求流程&#xff1a;構造 NSURL 對象創建 NSURLSessionDataTask發起請求&#xff08;resume&#xff09;在回調中解析數據回到主線程…

MySQL 8.4 Windows 版安裝記錄與步驟參考

導語&#xff1a; MySQL 作為廣泛使用的開源數據庫管理系統&#xff0c;是許多開發者和學習者的必備工具。最近有朋友詢問安裝過程&#xff0c;正好整理了 MySQL 8.4 在 Windows 系統下的安裝步驟和一些注意事項&#xff0c;分享給有需要的朋友做個參考。關于 MySQL&#xff1a…

七、搭建springCloudAlibaba2021.1版本分布式微服務-skywalking9.0鏈路追蹤

前言鏈路追蹤介紹 對于一個大型的幾十個&#xff0c;幾百個微服務構成的微服務架構系統&#xff0c;通常會遇到下面的一系列問題。 如何串聯整個調用鏈路&#xff0c;快速定位問題&#xff1f;如何澄清各個微服務之間的依賴關系&#xff1f;如何進行各個微服務接口的性能分析&a…

深入理解大語言模型生成參數:temperature、top\_k、top\_p 等全解析

在使用大語言模型&#xff08;如 GPT-4、LLaMA、ChatGLM 等&#xff09;進行文本生成任務時&#xff0c;很多開發者會面對各種“生成參數”&#xff0c;如 temperature、top_k、top_p、repetition_penalty 等。這些參數雖然看起來抽象&#xff0c;但掌握它們的意義和配置技巧&a…

vulhub Web Machine(N7)靶場攻略

下載地址&#xff1a; https://download.vulnhub.com/webmachine/Web-Machine-N7.ova 使用方法&#xff1a; 靶場下載好以后不用解壓&#xff0c;需要使用Oracle VirtualBox虛擬機打開&#xff0c;用VMware會報錯。安裝Oracle VirtualBox虛擬機時安裝地址不能隨便選擇&#…

【機器學習深度學習】模型微調:多久才算微調完成?——如何判斷微調收斂,何時終止訓練

目錄 前言 一、微調過程的目標&#xff1a;優化模型表現 二、微調需要多久&#xff1f; 微調時間無法確定 三、如何判斷微調何時收斂&#xff1f; 3.1 觀察Loss的下降趨勢 3.2 損失值趨于平穩&#xff0c;意味著收斂 如何識別收斂&#xff1f; 3.3 驗證Loss的波動&…

紅隊視角:實戰滲透測試中漏洞利用的進階技巧與防御

紅隊作為滲透測試的 “攻擊方”&#xff0c;其核心價值不僅在于發現漏洞&#xff0c;更在于挖掘漏洞的深度利用方式 —— 通過繞過防護措施、組合低危漏洞形成攻擊鏈&#xff0c;暴露企業真實安全風險。從紅隊視角解析漏洞利用的進階技巧&#xff0c;既能幫助防御方理解攻擊思路…

OpenHarmony BUILD.gn中執行腳本

在OpenHarmony編譯構建中筆者經常遇到這樣的場景——需要執行sh腳本完成某些操作。筆者將OpenHarmony BUILD.gn中執行腳本的方法分享如下&#xff1a; 前置知識點 1.能夠把自定義的子系統加入OpenHarmony源碼的編譯構建&#xff0c;請參考&#xff1a;https://ost.51cto.com/…

QUIC協議如何在UDP基礎上解決網絡切換問題

一、UDP 四元組的本質局限UDP 本身無連接狀態&#xff0c;其數據包僅通過四元組尋址。但 QUIC 在 UDP 之上構建了完整的連接語義。二、QUIC 的連接遷移核心機制1. 連接標識符&#xff08;Connection ID&#xff09;關鍵設計&#xff1a;每個 QUIC 連接擁有全局唯一 64-bit Conn…

力扣131:分割回文串

力扣131:分割回文串題目思路代碼題目 給你一個字符串 s&#xff0c;請你將 s 分割成一些 子串&#xff0c;使每個子串都是 回文串 。返回 s 所有可能的分割方案。 思路 從題目中我們可以總結出這道題的三個需要解決的問題&#xff1a; 如何判斷回文串如何找到一種方案里的所…

代駕小程序系統開發:引領出行行業數字化轉型

隨著數字技術的飛速發展&#xff0c;出行行業正經歷著深刻的數字化轉型。代駕小程序系統作為這一轉型的重要推手&#xff0c;以其高效、便捷、智能的特點&#xff0c;引領著出行行業向數字化、網絡化、智能化方向發展。一、數字化管理&#xff0c;提升運營效率代駕小程序系統通…

數獨求解器與生成器(回溯算法實現)

摘要本畢業設計旨在利用MATLAB技術實現一個基于回溯算法的數獨求解器與生成器。通過深入分析數獨游戲的規則和回溯算法的原理&#xff0c;設計并實現了數獨求解的核心算法&#xff0c;同時開發了數獨生成功能&#xff0c;能夠生成符合規則的有效數獨謎題。系統采用MATLAB圖形用…

[數據結構]#7 哈希表

哈希表&#xff08;Hash Table&#xff09;&#xff0c;有時也稱為散列表&#xff0c;是一種數據結構&#xff0c;它提供了一種快速存取數據的方法。哈希表利用一個被稱為哈希函數的機制將鍵映射到表中的一個位置來直接訪問記錄&#xff0c;以此加快查找的速度。哈希表通常支持…

C++ 23種設計模式-工廠模式

工廠模式是一種創建型的設計模式&#xff0c;他提供了一種創建對象的最佳方式&#xff0c;而無需指定將要創建對象的具體類。包括&#xff1a;簡單工廠模式、工廠方法模式、抽象工廠模式。簡單工廠模式組成成員&#xff1a;抽象產品類、具體產品類 A、B、C等、工廠類工作原理&a…

vue3 el-table 行的某個特定值來決定某些列是否顯示

在 Vue 3 中使用 Element Plus 的 <el-table> 組件時&#xff0c;如果你想要根據行的某個特定值來決定某些列是否顯示&#xff0c;你可以通過自定義列渲染函數&#xff08;render 函數&#xff09;來實現這一需求。下面是一個如何實現該功能的步驟說明和示例代碼。步驟 1…

電商數據采集API與爬蟲技術結合的全網比價方案

一、技術選型與工具準備API優先策略官方API接入&#xff1a;京東、淘寶、拼多多等平臺提供商品詳情API&#xff0c;需注冊開發者賬號獲取API Key。例如&#xff1a;京東API支持實時獲取商品價格、庫存、評價數據。淘寶API通過RESTful接口返回JSON格式的商品信息&#xff0c;需O…

Socket詳解

一.定義Socket&#xff08;套接字&#xff09;是網絡編程的核心&#xff0c;它允許不同主機或同一主機的不同進程之間進行通信&#xff0c;Socket API 提供了一套標準的接口&#xff0c;支持 TCP、UDP、IP 等協議分為以下三個類型&#xff1a;SOCK_STREAM: 用于tcp協議&#xf…