您正在查看 Apigee 和 Apigee Hybrid 說明文件。
查看
Apigee Edge 說明文件。
ResourceDoesNotExist
錯誤訊息
透過 Apigee UI 或 API 部署 API Proxy 時失敗,並顯示以下錯誤訊息:
Error Deploying Revision <var>revision_number</var> to <var>environment</var>
Resource with name <var>ResourceURL</var> and type java does not exist.
錯誤訊息範例
Error Deploying Revision 1 to test
Resource with name myresource.jar and type java does not exist.
錯誤螢幕截圖範例
原因
如果 API 代理程式或環境層級中,沒有 JavaCallout 政策中 <ResourceURL>
元素中指定的資源,則 API 代理程式的部署作業會失敗。
診斷
找出環境和資源名稱。您可以在錯誤訊息中找到這項資訊。舉例來說,在下列錯誤中,環境為
test
,且 <ResourceURL>
元素中使用的資源名稱為myresource.jar
。Error Deploying Revision 1 to test Resource with name myresource.jar and type java does not exist.
判斷使用上述步驟 1 中所述資源的 JavaCallout 政策。
舉例來說,下列政策會將 <
ResourceURL>
的值指定為myresource.jar
,與錯誤訊息中的值相符:<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <JavaCallout name="hello-java"> <ClassName>com.apigeesample.HelloJava</ClassName> <ResourceURL>java://myresource.jar</ResourceURL> </JavaCallout>
判斷資源是否屬於失敗的 API Proxy 或在環境層級上傳的資源。如果不是,則表示這是錯誤的原因。
前往 API 代理程式編輯器的「Navigator」窗格中的「Resources」分頁,查看在 API 代理程式層級上傳的所有資源。在本範例中,API 代理程式沒有上傳任何資源。
資源可在環境層級提供。詳情請參閱「資源檔案」。
如要判斷資源是否存在於環境層級,請使用 curl 發出下列 API 呼叫:
curl \ "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \ -H "Authorization: Bearer $TOKEN"
其中
$TOKEN
會設為您的 OAuth 2.0 存取權憑證,如取得 OAuth 2.0 存取權憑證一節所述。如要瞭解本範例中使用的curl
選項,請參閱「使用 curl」。如要瞭解所使用的環境變數,請參閱「為 Apigee API 要求設定環境變數」。
如果您收到的回應狀態碼為 404,表示環境層級缺少資源。
如果 API 代理程式和環境層級無法使用資源,系統會傳回部署錯誤:
Resource with name myresource.jar and type java does not exist. ```
解決方法
請確認 <ResourceURL>
元素中指定的資源確實存在於 API 代理程式或環境層級。詳情請參閱「管理資源」。
如要修正上述 JavaCallout 政策範例,請在適當層級 (API 代理程式或環境層級) 上傳 JAR 檔案。
NoResourceForURL
錯誤訊息
透過 Apigee UI 或 API 部署 API Proxy 時失敗,並顯示以下錯誤訊息:
Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL <var>ResourceURL</var>
錯誤訊息範例
Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar
錯誤螢幕截圖範例
原因
如果資源檔案損毀或部分上傳,即使在 API 代理程式或環境層級中顯示存在,仍可能發生這個錯誤。
診斷
請找出環境和資源名稱。您可以在錯誤訊息中找到這項資訊。舉例來說,在以下錯誤中,環境名稱為
test
,<ResourceURL>
元素中使用的資源名稱為myresource.jar
。Error in deployment for environment test The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar
請確認資源是在 API 代理程式或環境層級上傳。在下方範例中,您可以看到資源
myresource.jar
是在 API 代理程式層級上傳。資源可在環境層級提供。詳情請參閱「資源檔案」。
如要判斷資源是否存在於環境層級,請使用 curl 發出下列 API 呼叫:
curl \ "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \ -H "Authorization: Bearer $TOKEN"
其中
$TOKEN
會設為您的 OAuth 2.0 存取權憑證,如「取得 OAuth 2.0 存取權憑證」一節所述。如要瞭解本範例中使用的curl
選項,請參閱「使用 curl」。如果您收到的回應狀態碼為 404,表示環境層級缺少資源。
解決方法
- 如果您判斷資源位於 API 代理程式或環境層級,請按照步驟 2 所述刪除資源,然後重新上傳。如果您只有一個網域,請跳到步驟 3。
如要刪除 API 代理程層級的資源,請前往 API 代理程編輯器的「Navigator」窗格中的「Resources」分頁,然後按一下資源旁邊的「X」按鈕,如下所示。
如要刪除環境中的資源,請在先前診斷步驟中使用的 API 呼叫中使用 DELETE 動詞。舉例來說,如要在環境層級刪除資源,請輸入下列指令:
curl -X DELETE \ "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \ -H "Authorization: Bearer $TOKEN"
其中
$TOKEN
會設為您的 OAuth 2.0 存取權憑證,如「取得 OAuth 2.0 存取權憑證」一節所述。如要瞭解本範例中使用的curl
選項,請參閱「使用 curl」。如果重新上傳資源仍無法解決問題,請與 Apigee 支援團隊聯絡。
JavaCalloutInstantiationFailed
錯誤訊息
透過 Apigee UI 或 API 部署 API Proxy 時失敗,並顯示以下錯誤訊息:
Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class <var>class_name</var>
或
Error in deployment for environment <var>environment</var>.
The revision is deployed and traffic can flow, but flow may be impaired. Failed to instantiate the JavaCallout Class <var>class_name</var>
錯誤訊息範例
Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
錯誤螢幕截圖範例
原因
以下是這項錯誤的常見原因
原因 | 說明 |
缺少 JAR 檔案 | 系統不會上傳含有錯誤中指出的 Java 類別的 JAR 檔案。 |
毀損的 JAR 檔案 | 含有錯誤中指出的 Java 類別的 JAR 檔案已損毀/部分上傳。 |
缺少類別檔案 | 錯誤中指出的 Java 類別檔案並非 >ResourceURL< 或相關 JAR 檔案中指定的 JAR 檔案的一部分。 |
Java 程式碼問題 | 程式碼有錯誤,例如缺少建構函式、程式碼依附問題或其他問題。 |
常見的診斷步驟
找出無法匯入的環境和類別名稱。例如,在下列錯誤訊息中,環境名稱為
test
,類別名稱為my.class
:Error in deployment for environment test The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
原因:缺少 JAR 檔案
診斷
- 判斷 JAR 檔案是否應包含上述步驟 1 中所述的類別,且無法例項化。
- 檢查是否在 API Proxy 或環境層級上傳特定 JAR 檔案。如果 JAR 檔案未上傳至任何層級,請參閱「解決方法」。
- 如果您已上傳 JAR 檔案,請參閱「原因:毀損的 JAR 檔案」一節。
解決方法
- 如果 JAR 檔案損毀或部分上傳,請重新建構 JAR 檔案,並在適當層級 (API 代理或環境層級) 上傳 JAR 檔案。
- 重新部署 API Proxy。
原因:毀損的 JAR 檔案
診斷
- 判斷 JAR 檔案是否包含無法例項化的類別 (請參閱上述步驟 1)。
- 檢查特定 JAR 檔案是否已損毀。例如,如果檔案已損毀或部分上傳,您就無法解壓縮檔案。如果檔案已損毀,請前往「解析度」一節。
- 如果 JAR 檔案並未損毀,請參閱「原因:缺少類別檔案」。
解決方法
- 在適當層級 (API 代理程式或環境層級) 重建損毀的 JAR 檔案,並上傳 JAR 檔案。
- 重新部署 API Proxy。
原因:缺少類別檔案
診斷
- 檢查特定 Java 類別檔案 (在上述步驟 1 中指出) 是否屬於 >ResourceURL< 或任何相關 JAR 檔案中指定的 JAR 檔案。
- 如果任何 JAR 檔案中都沒有類別檔案,您就已找出錯誤的原因。前往「解析度」。
- 如果類別檔案存在於 JavaCallout 政策中指定的其中一個 JAR 檔案中,則 Java 程式碼或依附類別一定有問題,才會導致這項錯誤。如需協助,請與 Apigee 支援團隊聯絡。
解決方法
- 使用缺少的類別檔案重新建構 JAR,並在適當層級 (API 代理程式或環境層級) 上傳 JAR 檔案。
- 重新部署 API Proxy。
上傳 JAR 檔案
請確認 API Proxy 或環境層級中,有包含所有必要類別的資源元素。詳情請參閱「資源檔案」。
如要上傳 API 代理程式層級的資源,請按一下「Resources」分頁中的「+」 (加號),然後選取「Import file」,並從本機上傳檔案。檔案名稱應與 >ResourceURL< 元素相符,但不含
java://
前置字串。如果您希望資源可供同一個環境中的多個 API 代理程式使用,請將資源上傳至該環境。您必須使用 Apigee API,如「資源檔案」一節所述。
舉例來說,您可以從本機輸入下列 API 呼叫,在環境層級上傳指定的檔案:
curl -H "Content-Type: application/octet-stream" \ -X POST -H "Authorization: Bearer $TOKEN" --data-binary @{classes.jar} \ "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles?name=myresouce.jar&type=java"
其中
$TOKEN
會設為您的 OAuth 2.0 存取權憑證,如「取得 OAuth 2.0 存取權憑證」一節所述。如要瞭解本範例中使用的curl
選項,請參閱「使用 curl」。從檔案所在的目錄發出 API 呼叫。
如要讓檔案可供機構內所有環境中的所有 API 代理程式使用,您可以省略 basepath 中的環境詳細資料。例如:
curl -H "Content-Type: application/octet-stream" \ -X POST -H "Authorization: Bearer $TOKEN" --data-binary @{classes.jar} \ "https://apigee.googleapis.com/v1/organizations/$ORG/resourcefiles?name=myresouce.jar&type=java"
其中
$TOKEN
會設為您的 OAuth 2.0 存取權憑證,如「取得 OAuth 2.0 存取權憑證」一節所述。如要瞭解本範例中使用的curl
選項,請參閱「使用 curl」。