本文檔旨在協助開發人員快速接入和使用Java SDK,重點解答使用過程中遇到的常見問題,確保開發人員能夠準確且高效地進行相關操作。
環境檢查
確保Java語言環境已經正確安裝,Java版本 >= 1.8。
確保您的網路能夠訪問阿里雲的API。
問題列表
code 403,You are not authorized to do this operation. Action: xxxx。
code: 404, Specified api is not found, please check your url and method。
Specified signature does not match our calculation. server StringToSign is XXX。
SDK.EndpointResolvingError :” No such region 'cn-XX'. Please check your region ID。
調用OpenAPI介面時報錯 code: 4θ1, You have not activated the XXX service 或類似提示。
問題1:AK傳參問題。
問題現象:代碼運行時報錯,報錯資訊中包含如下資訊時,表示AK未正確地設定阿里雲的憑證(AccessKey)。
V2.0 SDK:Cannot invoke "com.aliyun.credentials.Client.getCredential()" because "this._credential" is null”
V1.0 SDK:ErrCode:MissingAccessKeyId.ErrMsg:AccessKeyId is mandatory for this action。
解決方案:
執行以下命令,檢查您的環境變數中是否配置有ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET:
Linux/macOS
echo $ALIBABA_CLOUD_ACCESS_KEY_ID echo $ALIBABA_CLOUD_ACCESS_KEY_SECRET
Windows
echo %ALIBABA_CLOUD_ACCESS_KEY_ID% echo %ALIBABA_CLOUD_ACCESS_KEY_SECRET%
若返回正確的AccessKey,則說明配置成功。如果返回為空白或錯誤,請嘗試重新設定,具體操作請參見在Linux、macOS和Windows系統配置環境變數。
檢查代碼中AK相關內容是否存在錯誤。
常見的錯誤樣本:
Config config = new Config() .setAccessKeyId(System.getenv("yourAccessKeyID")) .setAccessKeySecret(System.getenv("yourAccessKeySecret"));
正確樣本:
Config config = new Config() .setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")) .setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
說明System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")和System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"),表示的是從環境變數中擷取ALIBABA_CLOUD_ACCESS_KEY_ID及ALIBABA_CLOUD_ACCESS_KEY_SECRET的值。
重要切勿直接線上上代碼中明文寫入 AccessKey,該寫法存在安全隱患。
問題2:code 403,You are not authorized to do this operation. Action: xxxx。
此問題的直接原因在於調用API的RAM使用者、角色或使用者組未被授予 XXXX
許可權(錯誤資訊中的 Action
值)。Action:XXXX(如Action:dysms:SendSms)其中dysms:SendSms
表示當前帳號所需的具體API許可權。其格式為:<服務縮寫>:<API名稱>
。在此樣本中dysms:SendSms
表示需要簡訊服務的SendSms
API許可權。
阿里雲通過 RAM(資源訪問管理)對許可權進行控制,需通過權限原則(Policy)明確授權 RAM 使用者、角色或使用者組可操作的 API(Action)、資源(Resource)及條件(Condition)。有關詳細資料,請參見權限原則概覽。
解決方案:
許可權診斷:使用診斷平台進行許可權檢查。請登入OpenAPI自助診斷進行排查。
許可權授予:請檢查調用RAM使用者、角色或使用者組是否具備所調用API的許可權。如果未獲得相應許可權,則需為其授予相應的API許可權。具體操作,請參見權限原則。
許可權驗證:授權完成後,請重新嘗試執行原操作(許可權變更通常需 1~5分鐘生效),以確認許可權已正確授予相關帳號。
問題3:com.aliyun.XX.XX
導包無效。
問題描述:
在使用 com.aliyun.XX.XX
類時,發現無法匯入該類,IDE 提示找不到相關依賴或類。例如:
import com.aliyun.teaopenapi.Client; // 提示:The import com.aliyun.XXX cannot be resolved。
同時,Maven 專案中已添加了以下依賴:但仍然無法正常下載依賴。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea-openapi</artifactId>
<version>0.3.8</version>
</dependency>
導致原因:
Maven 配置未包含阿里雲鏡像倉庫:預設情況下,Maven 使用中央倉庫(Central Repository)下載依賴。如果網路環境不穩定或未配置阿里雲鏡像倉庫,可能會導致依賴下載失敗。
本地 Maven 緩衝損壞:如果本地
.m2/repository
目錄中的快取檔案損壞,可能導致依賴無法正確載入。網路問題:如果網路連接不穩定,Maven 可能無法成功從遠程倉庫下載依賴。
依賴版本不存在或錯誤:指定的依賴版本(如
0.3.8
)可能已被移除或不存在。IDE 配置問題:IDE(如 IntelliJ IDEA 或 Eclipse)的 Maven 外掛程式未正確載入依賴,可能是由於未重新重新整理專案或配置錯誤。
解決方案:
找到 Maven 的
settings.xml
檔案:預設路徑為~/.m2/settings.xml
(Linux/Mac)或C:\Users\<使用者名稱>\.m2\settings.xml
(Windows)。添加以下鏡像配置:<mirrors> <mirror> <id>aliyunmaven</id> <mirrorOf>*</mirrorOf> <name>阿里雲公用倉庫</name> <url>https://maven.aliyun.com/repository/public</url> </mirror> </mirrors>
儲存檔案後,重新運行
mvn clean install
命令以更新依賴。清理本地 Maven 緩衝。刪除本地
.m2/repository
目錄下的對應依賴緩衝。重新下載依賴:mvn clean install
檢查網路連接。測試網路連通性:
ping maven.aliyun.com
如果網路受限可以切換到其他網路環境。
確認指定的依賴版本是否有效,請執行命令:
mvn versions:display-dependency-updates
,以查看所有可用版本。隨後,選擇其他可用版本並更新pom.xml
。如果依賴已正確下載,但 IDE 仍無法識別,可能是 IDE 配置問題。
IntelliJ IDEA:
點擊右側的 Maven 工具視窗。
點擊“Reload All Maven Projects”按鈕(重新整理表徵圖)。
Eclipse:
右鍵點擊專案 -> 選擇“Maven” -> “Update Project”。
勾選“Force Update of Snapshots/Releases”,然後點擊“OK”。
確保專案的
pom.xml
檔案中沒有其他衝突的依賴或錯誤配置。運行以下命令檢查依賴樹:mvn dependency:tree
如果存在衝突,使用
<exclusions>
標籤排除舊版本依賴解決衝突。執行
mvn clean install -U
命令以清理緩衝並重新構建專案。
問題4:java.lang.NoSuchMethodError: com.aliyun.credentials.Client.getCredential()Lcom/aliyun/credentials/models/CredentialModel。
該錯誤表明代碼中調用了 com.aliyun.credentials.Client
類的 getCredential()
方法,但運行時找不到該方法。通常是因為依賴的 credentials-java
包版本過低,導致運行時類庫與編譯時間使用的 API 不相容。可能的原因包括:
依賴版本過低:當前使用的
credentials-java
版本較低,而代碼中調用的方法(如getCredential()
)則屬於較高版本。依賴衝突:專案中可能存在多個版本的
credentials-java
包,導致運行時載入了錯誤的版本。未正確更新依賴:在升級
credentials-java
包後,未重新構建專案或清理緩衝,導致舊版本仍然被使用。
解決方案:
升級
credentials-java
包到最新版本:<dependency> <groupId>com.aliyun</groupId> <artifactId>credentials-java</artifactId> <version>1.0.1</version> </dependency>
執行
mvn clean install
以更新依賴。檢查依賴衝突,使用 Maven 的
dependency:tree
命令檢查是否存在多個版本的credentials-java
包:mvn dependency:tree | grep credentials-java
如發現多個版本,使用
<exclusions>
標籤排除舊版本依賴解決衝突。清理緩衝並重新構建專案,Maven的緩衝有時可能導致舊版本的依賴未被正確替換。請執行
mvn clean install -U
命令以清理緩衝並重新構建專案。
問題5:java: 錯誤:不支援發行版本 X。
同步選取Ctrl+Alt+Shift+S
,進入Project Structure視窗。選擇Modules,在右側Language Level中選擇跟您所使用JDK版本一致的版本,例如您所使用的JDK 8,Language Level選擇“8 - Lambdas, type annotations etc. ”。單擊Apply,單擊OK。
問題6:java: Compilation failed: internal java compiler error。
在IntelliJ IDEA功能表列,單擊File->Settings->Build, Execution, Deployment->Compiler->Java Compiler,Project bytecode version和Target bytecode version選擇跟您所使用JDK版本一致的版本,例如您所使用的JDK 8,這兩項選擇 8 即可。單擊Apply,單擊OK。
問題7:code: 400, <CERTAIN_FIELD > is mandatory for this action。
此問題的直接原因在於在調用API時未填寫必填參數。解決方案:
這裡以調用簡訊服務的SendSms
介面為例:
進入OpenAPI門戶的API調試頁面,選擇雲產品和介面。
仔細對比構造的請求對象(如
SendSmsRequest
)是否填充了所有必需欄位,例如手機號、簽名等。參考API文檔確認必填項。確保必填參數值正確。
確保填寫的必填參數值正確無誤,例如手機號格式是否符合要求。
在調用 API 前,SDK 會對參數進行自動校正。如果缺少必要參數,您將收到類似
MissingRequiredParameter
的錯誤提示。例如,如果手機號參數缺失,會報錯 “MissingPhoneNumbers: code: 400”。
SendSmsRequest sendSmsRequest = new SendSmsRequest()
//需要替換成為您接收簡訊的手機號碼
.setPhoneNumbers("<YOUR_VALUE>")
//需要替換成為您的簡訊簽名
.setSignName("<YOUR_VALUE>")
//需要替換成為您的簡訊模板code
.setTemplateCode("<YOUR_VALUE>");
問題8:java.lang.NoSuchMethodError。
NoSuchMethodError異常多由依賴包版本衝突造成,主要因為在編譯與運行時使用了不同版本的依賴包,類載入器在編譯時間檢索到未定義方法/欄位/類。解決方案:
若是直接使用jar的使用者,可能是某些子級jar未依賴。根據堆棧排查缺失的jar包即可。
若是使用maven/gradle等包管理器使用者,可能是子級依賴衝突導致專案編譯時間使用的是低版本的包導致。可根據堆棧排查衝突的依賴並指定高版本即可。
問題9:java.net.SocketTimeoutException:connect timed out”、 “java.net.SocketTimeoutException:Read timed out”、 “SDK.ServerUnreachable”、 “Connection aborted”或“RemoteDisconnected”。
逾時問題可能由多種因素引起,以下是一些常見的原因及相應的解決步驟:
網路連接問題
情況描述:用戶端與伺服器之間的網路不通或網路不穩定導致請求無法到達目標伺服器。
解決方案:
使用ping
或curl
命令測試本地主機與雲產品Endpoint之間連通性,例如調用傳送簡訊介面逾時時,使用ping dysmsapi.aliyuncs.com或curl -v https://dysmsapi.aliyuncs.com測試連通性。
若命令執行逾時或者無響應,請檢查本地防火牆或路由器中是否有阻斷策略。
若命令有響應,建議設定合理的逾時時間,避免因配置不當導致請求失敗,具體操作請參見逾時機制。範例程式碼如下:
// 運行時參數逾時設定,僅對使用了該運行時參數執行個體的請求有效
RuntimeOptions runtimeOptions = new RuntimeOptions();
runtimeOptions.connectTimeout = 5000;
API處理時間過長
情況描述:目標API處理請求的時間超過了設定的讀逾時時間。
解決方案:通過配置讀逾時時間來適應較長的API回應時間, 具體操作請參見逾時機制。例如通過配置讀逾時時間參數來延長當前請求的讀逾時時間,範例程式碼如下:
// 運行時參數逾時設定,僅對使用了該運行時參數執行個體的請求有效
RuntimeOptions runtimeOptions = new RuntimeOptions();
runtimeOptions.readTimeout = 10000;
問題10:Your request is denied as lack of ssl protect.RequestId 。
此問題是由於介面要求使用HTTPS協議進行調用,而您可能使用了原版JavaSDK,採用了HTTP協議進行調用。解決方案:
V1.0 SDK 可以通過對 Request 對象佈建要求通過 HTTPS 協議發送:
request.setSysProtocol(com.aliyuncs.http.ProtocolType.HTTPS);
使用V2.0SDK,V2.0SDK預設使用HTTPS協議。
問題11:code: 404, Specified api is not found, please check your url and method。
此類錯誤的直接原因可能是您在調用某產品API時,填寫了錯誤的Endpoint或RegionId。解決方案如下:
確保您所選地區支援您正在調用的服務。產品的Endpoint可以通過OpenAPI 開發人員門戶的產品首頁中進行尋找,這裡以簡訊服務為例。
問題12:Unexpected response code for CONNECT: 400。
此問題直接原因為請求未發送到阿里雲網關,被中間節點截斷。解決方案:
可能是代理配置錯誤,例如您配置的是setHttpProxy,V2.0 SDK預設發送HTTPS請求,即代理不生效會引發此報錯。可通過配置協議類型為HTTP嘗試解決,config.protocol = "HTTP"。
可能代理服務配置錯誤,即代理服務無法正確轉寄請求到阿里雲網關,可通過curl檢查代理配置是否正確。curl https://<阿里雲服務網域名稱>/ -v -x <代理IP/代理網域名稱>:<代理連接埠>,例如curl https://ecs-cn-hangzhou.aliyuncs.com/ -v -x 127.0.0.1:3128。
可能被內網防火牆攔截,本地環境可嘗試切換網路環境測試,例如串連移動網路熱點。
問題13:Specified signature does not match our calculation. server StringToSign is XX。
此問題直接原因為用戶端簽名參數和服務端計算得到簽名參數不匹配導致報錯。解決方案:
在絕大多數情境中,使用者SK填寫資訊存在錯誤,因此應首先重建一版新的AK,然後再進行後續的排查。
升級SDK子級依賴openapiutil到最新版本。
通過抓取請求包,檢查網路層面是否遭遇欄位攔截。
代碼調試,檢查用戶端是否存在特殊字元導致的轉碼異常。
檢查以下依賴包版本是否過低。
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.15</version> </dependency>
檢查是否在並發情境重新new request,request並不安全執行緒。
問題14:Can not set java.lang.String field com.aliyun.imm20200930.models.GenerateWebofficeTokenShrinkRequest.userShrink to java.util 。
此問題直接原因為低版本Tea包無法將複雜結構轉化為String結構導致報錯。解決方案:
升級Tea包到1.2.7及以上。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>tea</artifactId>
<version>1.2.7</version>
</dependency>
問題15:IDEA中使用Maven自動下載依賴失敗。
更新Maven倉庫
開啟”File“菜單,選擇”Settings“(或”Preferences“)。左側導覽列中,展開“Build, Execution, Deployment”,然後選擇“Build Tools” > “Maven”。找到“Repositories”選項卡,選擇本地倉庫,點擊“Update”按鈕,等待更新完成。
檢查IDEA緩衝
開啟“File”菜單,選擇“Invalidate Caches…”,在彈出的對話方塊中,選擇“Invalidate and Restart”,等待IDEA清理緩衝並重新啟動。
檢查網路連結
如果Maven無法串連到中央倉庫或其他遠程倉庫,它可能會無法下載依賴項。確保您的網路連接正常,並且沒有任何防火牆或Proxy 伺服器阻止Maven的訪問。
檢查Maven配置
檢查Maven設定檔(通常是settings.xml)是否正確配置。確保”localRepository“指向正確的本地倉庫路徑,”mirrors”、”proxies“、”profiles“正確配置。
問題16:使用反射導致的警告(WARNING)資訊如何避免。
在阿里雲 SDK 的使用中,當使用較高版本的JDK進行開發時,可能會遇到與反射相關的警告資訊,這些警告資訊可能影響程式的輸出,尤其是當您希望在生產環境中避免不必要的日誌資訊時。
解決方案:
您可以通過設定環境變數 ALIBABA_CLOUD_SDK_LOG_LEVEL
將記錄層級調整為 ERROR
,以抑制警告資訊的顯示。操作步驟:
設定環境變數:
Windows
set ALIBABA_CLOUD_SDK_LOG_LEVEL=ERROR
Linux/macOS
export ALIBABA_CLOUD_SDK_LOG_LEVEL=ERROR
確認環境變數設定:
Windows
echo %ALIBABA_CLOUD_SDK_LOG_LEVEL%
Linux/macOS
echo $ALIBABA_CLOUD_SDK_LOG_LEVEL
啟動您的應用程式:在您配置好環境變數後,啟動您的 Java 應用程式。此時,阿里雲 SDK 產生的警告資訊將不會被顯示,您只會看到
ERROR
層級或更高的日誌資訊。
如果您需要變更記錄檔層級以調試或開發,可以將環境變數的值更改為
DEBUG
或INFO
。
問題17:Specified signature does not match our calculation。
此問題直接原因通常是由於請求的簽名與伺服器計算的簽名不匹配引起的。可能的原因包括:
Access Key (AK) 複製錯誤
簽名演算法不正確
檢查請求參數及其順序是否符合API要求。
確保在代碼中設定的Access Key和Secret Key與您在控制台上擷取的完全一致。檢查是否有多餘的空格或者特殊字元。解決方案:
升級commons-codec
版本,以避免潛在的簽名計算錯誤:
更新依賴:
Maven
修改pom.xml
檔案
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version> <!-- 更新後的版本 -->
</dependency>
進行版本號碼更新後,執行以下命令:
mvn clean install
Gradle
在build.gradle
檔案中添加或更新依賴:
dependencies {
implementation 'commons-codec:commons-codec:1.15' // 更新後的版本
}
執行以下命令以構建專案:
gradle build
問題18:SDK.EndpointResolvingError :” No such region 'cn-XX'. Please check your region ID“。
此問題直接原因是由於SDK版本過低導致無法支援新地區或介面的調用,解決方案:
升級SDK依賴版本:
Maven
如果您使用 Maven 進行專案管理,請在 pom.xml
檔案中更新依賴版本:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.7.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-sts</artifactId>
<version>3.1.2</version>
</dependency>
Gradle
如果您使用 Gradle 進行專案管理,請在 build.gradle
檔案中更新依賴版本:
dependencies {
implementation 'com.aliyun:aliyun-java-sdk-core:4.7.2'
implementation 'com.aliyun:aliyun-java-sdk-sts:3.1.2'
}
問題19:Failed to instantiate [com.aliyuncs.IAcsClient]: Factory method 'iAcsClient' threw exception with message: org/apache/http/conn/ssl/DefaultHostnameVerifier 。
此問題的直接原因是使用阿里雲 SDK 的過程中,使用了不相容版本的 Apache HttpClient 庫,從而導致了錯誤。解決方案:
如果專案使用了多個依賴庫,確保沒有其他庫引入不相容的 HttpClient 版本。通過手動檢查或使用構建工具的依賴管理功能來審查。
Apache HttpClient 版本過低,建議更新至4.5.14及以上版本。
<dependency> <groupId>org.apache.httpcomponents.client</groupId> <artifactId>httpclient</artifactId> <version>4.5.14</version> <!-- 請檢查最新版本 --> </dependency>
問題20:調用OpenAPI介面時報錯 code: 4θ1, You have not activated the XXX service
或類似提示。
該錯誤表示當前使用的阿里雲帳號尚未開通或啟用對應的某項服務。其中 XXX
表示具體的服務名稱,如 OCR service
等。解決方案:
登入對應服務的管理主控台。
尋找並開通所需能力。
等待服務開通生效後重新調用介面。
Java語言基礎異常自查表
報錯資訊 | 錯誤原因 | 解決方案 |
NullPointerException | 嘗試在一個Null 物件上調用方法或訪問屬性。 | 在使用對象之前,先進行Null 物件判斷(null check)以避免null 指標異常。可以使用條件陳述式或斷言來進行判斷。 |
ArrayIndexOutOfBoundsException | 嘗試訪問數組中不存在的索引。 | 確保數組索引在有效範圍內,即大於等於0且小於數組長度。可以控制迴圈條件或手動檢查索引範圍來避免數組越界異常。 |
IllegalArgumentException | 方法接收到一個不合法的參數。 | 檢查傳遞給方法的參數,確保其滿足方法的要求。可以使用條件陳述式或斷言進行參數合法性檢查。 |
ArithmeticException | 在算術運算中發生了異常,例如除以0。 | 在進行算術運算之前,先進行必要的判斷和處理,確保不會出現異常情況。可以使用條件陳述式或異常處理機制來處理算術異常。 |
ClassCastException | 嘗試將一個對象轉換為不相容的類型。 | 在進行類型轉換之前,先使用 instanceof 運算子進行類型檢查,確保對象的類型是相容的。如果類型不相容,可以考慮使用合適的類型轉換或者重新設計對象的繼承關係。 |
FileNotFoundException | 嘗試開啟一個不存在的檔案。 | 確保檔案路徑和檔案名稱正確,並且檔案存在於指定的位置。可以使用條件陳述式或異常處理機制來處理檔案未找到異常。 |
IOException | 在進行輸入輸出操作時發生了異常,如讀寫檔案、網路通訊等。 | 檢查輸入輸出操作的正確性,確保檔案或資源可用,並處理可能的異常情況。可以使用異常處理機制來處理輸入輸出異常。 |
InterruptedException | 在進行多線程操作時,線程被意外中斷。 | 在處理多線程操作時,對線程中斷進行適當的處理。可以使用異常處理機制或條件判斷來處理線程中斷異常。 |
NoSuchMethodException | 嘗試調用一個不存在的方法。 | 檢查方法名和參數是否正確,並確保調用的方法存在。可以使用條件陳述式或異常處理機制來處理方法不存在異常。 |
NumberFormatException | 將一個無法轉換為數位字串轉換為數字。 | 在進行字串轉換為數位操作時,先進行合理的校正,確保字串能夠正確轉換為數字。可以使用條件陳述式或異常處理機制來處理數字格式異常。 |
IndexOutOfBoundsException | 嘗試訪問列表或字串中不存在的索引。 | 確保索引在有效範圍內,即大於等於0且小於列表或字串的長度。可以使用條件陳述式或異常處理機制來處理索引越界異常。 |
UnsupportedOperationException | 嘗試調用一個不支援的方法或操作。 | 查閱文檔或API文檔,瞭解支援的方法和操作。確保方法或操作在當前環境下是可行的。 |
IllegalMonitorStateException | 在不合適的時候調用 wait()、notify() 或 notifyAll() 方法。 | 確保在同步代碼塊中正確使用 wait()、notify() 或 notifyAll() 方法。可以使用條件陳述式或異常處理機制來處理非法的監視器狀態異常。 |
SecurityException | 嘗試執行違反安全規則的操作,如未授權的訪問、檔案許可權等。 | 檢查代碼中的安全規則,確保不違反安全規則。可以根據安全規則進行相應的調整和修改。 |
ClassNotFoundException | 嘗試載入一個不存在的類。 | 在SDK中一般是依賴衝突,多個依賴版本共存導致類載入器載入了錯誤版本的類。檢查類名和類路徑是否正確,並確保所需的類存在。可以使用條件陳述式或異常處理機制來處理類未找到異常。 |
NoSuchFieldException | 嘗試訪問一個不存在的欄位。 | 在SDK中一般是依賴衝突,即低版本依賴搶佔了索引,導致V2.0 SDK的方法不存在。確保欄位名正確,並確保訪問的欄位存在。可以使用條件陳述式或異常處理機制來處理欄位不存在異常。 |
支援人員
以上問題的解決方案旨在協助您更友好地使用阿里雲SDK。如果您在使用過程中遇到其他問題,請通過以下方式與我們聯絡:
提交工單:阿里雲提交工單頁面。
如果您有相關需求或反饋,可以添加DingTalk群聯絡阿里雲技術支援人員,群號為60965016010。