您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件。 資訊
ResourceDoesNotExist
錯誤訊息
無法透過 Edge UI 或 Edge Management 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 Proxy、環境或機構層級不存在 Java callout 政策 <ResourceURL>
元素中指定的資源,API Proxy 的部署作業就會失敗。
診斷
識別環境與資源名稱。您可以在錯誤訊息中找到這項資訊。例如,在下列錯誤中,環境為
test
,<ResourceURL>
元素使用的資源名稱為myresource.jar
。Error Deploying Revision 1 to test Resource with name myresource.jar and type java does not exist.
確定 Java 呼叫政策使用的是上述步驟 1 中識別的資源。
舉例來說,下列政策將 <
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 Proxy 編輯器,前往「Navigator」窗格的「Resources」分頁,查看在 API Proxy 層級上傳的所有資源。在這個範例中,API Proxy 未上傳任何資源。
資源可在環境或機構層級使用。詳情請參閱「資源檔案」。
如要判斷資源是否位於環境層級,請使用 curl 發出下列 API 呼叫:
curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"
如要判斷該資源是否存在於機構層級,請使用 curl 發出下列 API 呼叫,並省略環境詳細資料:
curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"
如果您收到 404 狀態碼做為這些 API 的回應,表示機構和環境層級都缺少該資源。
如果在 API Proxy、機構和環境層級無法取得資源,系統會傳回部署錯誤:
Resource with name myresource.jar and type java does not exist. ```
解析度
確保 <ResourceURL>
元素中指定的資源位於 API Proxy、環境或機構層級。詳情請參閱「資源檔案」。
如要修正上述 Java 呼叫政策範例,請在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案。
NoResourceForURL
錯誤訊息
無法透過 Edge UI 或 Edge Management 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 Proxy、環境或機構層級,但也可能發生這個錯誤。
診斷
識別環境與資源名稱。您可以在錯誤訊息中找到這項資訊。舉例來說,在下列錯誤中,環境名稱為
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 Proxy、環境或機構層級上傳資源。在下方範例中,您可以看到資源
myresource.jar
已上傳在 API Proxy 層級。資源可在環境或機構層級使用。詳情請參閱「資源檔案」。
如要判斷資源是否位於環境層級,請使用 curl 發出下列 API 呼叫:
curl -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"
如要判斷資源是否存在於機構層級,請使用 curl 發出下列 API 呼叫,並省略環境詳細資料:
curl -v -u email "https://api.enterprise.apigee.com/v1/organizations/myorg/resourcefiles/java/myresource.jar"
如果您收到 404 狀態碼做為這些 API 的回應,表示機構和環境層級都缺少該資源。
解析度
- 如果您判斷該資源位於 API Proxy、機構或環境層級,請刪除資源並重新上傳 (如步驟 2 所述)。如果已完成設定,請跳至步驟 3。
如要刪除 API Proxy 層級的資源,請前往 API Proxy 編輯器的「Navigator」窗格中的「Resources」分頁,然後按一下資源旁的「X」按鈕,如下所示。
如要刪除環境或機構層級的資源,請在先前在診斷步驟的 API 呼叫中使用 DELETE 動詞。舉例來說,如要刪除環境層級的資源,請輸入下列指令:
curl -X DELETE -v -u <strong>email </strong>"https://api.enterprise.apigee.com/v1/organizations/myorg/environments/myenv/resourcefiles/java/myresource.jar"
在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案。
如果重新上傳資源無法解決問題,請重新啟動受影響的郵件處理器。如果您在 Cloud 中使用 Apigee Edge,請與 Apigee 支援團隊聯絡。如果您是 Private Cloud 使用者,請參閱「啟動、停止、重新啟動及檢查 Apigee Edge 的狀態」。
JavaCalloutInstantiationFailed
錯誤訊息
無法透過 Edge UI 或 Edge Management 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 檔案 | 系統不會上傳 JAR 檔案,其中含有錯誤所指明的 Java 類別。 |
毀損的 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 檔案
診斷
- 判斷應該包含類別 (在上述步驟 #1 識別) 且無法執行個體化的 JAR 檔案。
- 檢查特定 JAR 檔案是否已在 API Proxy、機構或環境層級上傳。如果 JAR 檔案未上傳到任何等級,請前往「Resolution」。
- 如果 JAR 檔案已上傳,請前往「Cause: Corrupted JAR File」。
解析度
- 如果 JAR 檔案損毀或部分上傳,請重新建構 JAR,並在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案。
- 重新部署 API Proxy。
原因:JAR 檔案毀損
診斷
- 判斷 JAR 檔案包含無法例項化的類別 (在上述步驟 #1 中找到)。
- 檢查特定的 JAR 檔案是否損毀。舉例來說,假設您因檔案損毀或未完整上傳而無法解壓縮檔案,如果毀損,請前往「解決」部分。
- 如果 JAR 檔案未損毀,請前往 Cause: Missing Class File (原因:缺少類別檔案)。
解析度
- 重建損毀的 JAR 檔案,並在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案。
- 重新部署 API Proxy。
原因:缺少類別檔案
診斷
- 確認特定的 Java 類別檔案 (於上述步驟 #1 識別) 屬於 >ResourceURL< 或任何相依 JAR 檔案中指定的 JAR 檔案。
- 如果任何 JAR 檔案中沒有類別檔案,您已決定發生錯誤的原因。前往「解析度」。
- 如果類別檔案存在於 Java 呼叫政策指定的其中一個 JAR 檔案中,則表示 Java 程式碼或相依類別有問題,導致這個錯誤。如果您是公開雲端使用者,請與 Apigee 支援團隊聯絡。 b.如果您是 Private Cloud 使用者,請前往「原因:Java 程式碼問題」。
解析度
- 使用缺少的類別檔案重新建構 JAR,並在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案。
- 重新部署 API Proxy。
原因:Java 程式碼問題
僅適用於私有雲使用者的診斷步驟
診斷
- 查看訊息處理器記錄 (
/opt/apigee/var/log/edge-message-processor/system.log
和/opt/apigee/var/log/edge-message-processor/configurations.log
)。 您可能會看見類似以下範例的例外狀況:
2019-07-05 05:40:13,240 org:myorg env:staging target:/organizations/myorg/apiproxies/MyAPI/revisions/5 action:add context-id: mode: Apigee-Main-53 ERROR CONFIG-CHANGE - AbstractConfigurator.add() : Add null to Step failed, reason: {} com.apigee.kernel.exceptions.spi.UncheckedException: Failed to instantiate the JavaCallout Class <class name> at com.apigee.steps.javacallout.JavaCalloutStepDefinition.newInstance(JavaCalloutStepDefinition.java:116) at com.apigee.messaging.runtime.StepDefinition.getStepDefinitionExecution(StepDefinition.java:218) …<snipped> Caused by: java.lang.reflect.InvocationTargetException: null at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at com.apigee.steps.javacallout.JavaCalloutStepDefinition.access$100(JavaCalloutStepDefinition.java:41) at com.apigee.steps.javacallout.JavaCalloutStepDefinition$CallOutWrapper.initialize(JavaCalloutStepDefinition.java:131) at com.apigee.steps.javacallout.JavaCalloutStepDefinition$CallOutWrapper.<init>(JavaCalloutStepDefinition.java:126) ... 42 common frames omitted Caused by: <Reason> ...<snipped>
請詳閱例外狀況,瞭解失敗的原因。一般來說,這可能代表 Java 程式碼中的某個問題。
解析度
- 視失敗的原因而定,您可能需要修正 Java 程式碼中的問題。
- 使用缺少的類別檔案重新建構 JAR,並在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案。
- 重新部署 API Proxy。
上傳 JAR 檔案
確認 API Proxy、環境或機構層級具備所有必要類別的資源元素。詳情請參閱「資源檔案」。
如要在 API Proxy 層級上傳資源,請按一下「資源」分頁中的「+」+ (加號),然後選取「匯入檔案」+,然後從本機電腦上傳檔案。檔案名稱應與 >ResourceURL< 元素相符,但不含
java://
前置字元。如果您想讓同一個環境中的多個 API Proxy 使用某個資源,請將資源上傳至環境。如資源檔案所述,您必須使用 Edge API。
例如,輸入下列從本機電腦呼叫的 API 呼叫,以上傳環境層級的指定檔案:
curl -v -u email -H "Content-Type: application/octet-stream" \ -X POST --data-binary @{classes.jar} \ "http://{mgmt_server}:{port}/v1/organizations/myorg/environments/myenv/resourcefiles?name=myresouce.jar&type=java"
從檔案所在的目錄發出 API 呼叫。
如要將檔案提供給機構中所有環境中的所有 API Proxy,您可以省略基本路徑中的環境詳細資料。例如:
curl -v -u email -H "Content-Type: application/octet-stream" \ -X POST --data-binary @{classes.jar} \ "http://{mgmt_server}:{port}/v1/organizations/myorg/resourcefiles?name=myresouce.jar&type=java"