查看 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.
錯誤螢幕截圖
原因
如果 Java 摘要政策的 <ResourceURL>
元素中指定的資源不在 API Proxy、環境或機構層級,API Proxy 部署作業就會失敗。
診斷
識別環境和資源名稱。你可以在錯誤訊息中找到這項資訊。舉例來說,在下列錯誤訊息中,環境為
test
,<ResourceURL>
元素中使用的資源名稱為myresource.jar
。Error Deploying Revision 1 to test Resource with name myresource.jar and type java does not exist.
決定使用步驟 1 指定資源的 Java 呼叫政策。
舉例來說,下列政策會將 <
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"
如果收到這些 API 的回應為 404 狀態碼,則機構和環境層級都會缺少資源。
如果無法在 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"
如果收到這些 API 的回應為 404 狀態碼,則機構和環境層級都會缺少資源。
解析度
- 如果您確定資源存在於 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 檔案 |
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 檔案
診斷
- 找出應包含無法例項化的類別 (如上述步驟 1 中所識別) 的 JAR 檔案。
- 檢查特定 JAR 檔案是否損毀。舉例來說,您無法因檔案損毀或未完整上傳而無法取消刪除。如果毀損,請前往「解析度」。
- 如果 JAR 檔案未損毀,請前往「Cause: Missing Class File」。
解析度
- 重新建構損毀的 JAR 檔案,並在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案。
- 重新部署 API Proxy。
原因:缺少類別檔案
診斷
- 檢查特定 Java 類別檔案 (如上述步驟 1 識別) 是否為 >ResourceURL<或任何相依 JAR 檔案
- 如果所有 JAR 檔案中沒有類別檔案,您已判斷造成錯誤的原因。前往「解析度」。
- 如果類別檔案位於 Java 呼叫政策中指定的其中一個 JAR 檔案,表示 Java 程式碼或相依類別發生問題,導致這個錯誤。 a.如果您是公用雲端的使用者,請與 Apigee 支援聯絡。 b.如果您是 Private Cloud 使用者,請移至「原因:Java Code 問題」。
解析度
- 使用缺少的類別檔案重新建構 JAR,並在適當的層級 (API Proxy、機構或環境層級) 上傳 JAR 檔案。
- 重新部署 API Proxy。
原因:Java 程式碼問題
僅適用於 Private Cloud 使用者的診斷步驟
診斷
- 查看訊息處理器記錄 (
/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 層級上傳資源,請按一下「Resources」分頁中的「+」 (加號),然後選取「Import file」,從本機電腦上傳檔案。檔案名稱應與 >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,您可以省略 basepath 中的環境詳細資料。例如:
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"