JavaCallout 政策部署錯誤疑難排解

您目前正在查看 ApigeeApigee 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.

錯誤螢幕截圖範例

將修訂版本 1 部署至測試時發生錯誤。

原因

如果 JavaCallout 政策<ResourceURL> 元素中指定的資源不存在於 API Proxy 或環境層級,API Proxy 的部署作業就會失敗。

診斷

  1. 找出環境和資源名稱。您可以在錯誤訊息中找到這項資訊。舉例來說,在下列錯誤中,環境為 test,而 <ResourceURL> 元素中使用的資源名稱為 myresource.jar

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. 找出使用上述步驟 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>
    
  3. 判斷資源是屬於失敗的 API Proxy,還是上傳至環境層級。如果不是,這就是錯誤原因。

    • 前往 API Proxy 編輯器的「Navigator」窗格,然後點選「Resources」分頁,即可查看在 API Proxy 層級上傳的所有資源。在本例中,API Proxy 沒有上傳任何資源。

      API Proxy 編輯器的「Navigator」窗格中的「Resources」分頁。

    • 資源可在環境層級使用。詳情請參閱「資源檔案」。

      • 如要判斷資源是否存在於環境層級,請使用 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 要求設定環境變數

      如果這些 API 的回應是 404 狀態碼,表示環境層級缺少資源。

    如果 API Proxy 和環境層級沒有可用資源,系統會傳回部署錯誤:

    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 代理或環境層級,如果檔案損毀或只上傳了一部分,就可能發生這項錯誤。

診斷

  1. 找出環境和資源名稱。您可以在錯誤訊息中找到這項資訊。舉例來說,在下列錯誤中,環境名稱為 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
    
  2. 請確認資源是在 API 代理或環境層級上傳。在下方範例中,您可以看到資源 myresource.jar 是在 API Proxy 層級上傳。

    API Proxy 資源。

    資源可在環境層級使用。詳情請參閱「資源檔案」。

    如要判斷資源是否存在於環境層級,請使用 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」。

    如果這些 API 的回應是 404 狀態碼,表示環境層級缺少資源。

解決方法

  1. 如果判斷資源存在於 API 代理或環境層級,請刪除資源並重新上傳,如步驟 2 所述。如果您只有一個網域,請跳到步驟 3。
  2. 如要在 API Proxy 層級刪除資源,請前往 API Proxy 編輯器的「Navigator」窗格,然後按一下資源旁邊的「X」按鈕,如下所示。

    如要刪除 API Proxy 層級的資源,請按一下「刪除」。

    如要刪除環境中的資源,請在先前用於診斷步驟的 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」。

  3. 上傳 JAR 檔案至適當層級 (API 代理或環境層級)。

  4. 如果重新上傳資源無法解決問題,請與 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 檔案已損毀/部分上傳。
缺少 Class 檔案 錯誤中識別的 Java 類別檔案,不屬於 >ResourceURL< 中指定的 JAR 檔案或相依 JAR 檔案。
Java 程式碼問題 程式碼有錯誤,例如缺少建構函式、程式碼依附元件問題或其他問題。

常見診斷步驟

  1. 找出環境名稱和無法匯入的類別。舉例來說,在下列錯誤訊息中,環境名稱為 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. 找出應包含類別 (如上述步驟 1 所述) 但無法例項化的 JAR 檔案。
  2. 檢查是否在 API Proxy 或環境層級上傳特定 JAR 檔案。如果 JAR 檔案未上傳至任何層級,請前往「解決方法」。
  3. 如果已上傳 JAR 檔案,請參閱「原因:JAR 檔案毀損」。

解決方法

  1. 如果 JAR 檔案已損毀或部分上傳,請重建 JAR,然後在適當層級 (API 代理或環境層級) 上傳 JAR 檔案
  2. 重新部署 API Proxy。

原因:JAR 檔案毀損

診斷

  1. 找出應包含無法例項化的類別 (如上述步驟 1 所述) 的 JAR 檔案。
  2. 檢查特定 JAR 檔案是否已毀損。舉例來說,如果檔案已毀損或部分上傳,您就無法將檔案解壓縮。如果損毀,請前往「解決方法」。
  3. 如果 JAR 檔案未損毀,請參閱「原因:缺少類別檔案」。

解決方法

  1. 重建損毀的 JAR 檔案,並在適當層級 (API 代理或環境層級) 上傳 JAR 檔案
  2. 重新部署 API Proxy。

原因:缺少類別檔案

診斷

  1. 檢查特定 Java 類別檔案 (如上述步驟 1 所述) 是否屬於 >ResourceURL< 中指定的 JAR 檔案,或任何相依的 JAR 檔案。
  2. 如果任何 JAR 檔案中都沒有類別檔案,您就已找出錯誤原因。前往「解決方案」。
  3. 如果類別檔案存在於 JavaCallout 政策中指定的其中一個 JAR 檔案,則 Java 程式碼或相關類別一定有問題,才會導致這個錯誤。如需協助,請與 Apigee 支援團隊聯絡。

解決方法

  1. 使用缺少的類別檔案重建 JAR,然後在適當層級 (API Proxy 或環境層級) 上傳 JAR 檔案
  2. 重新部署 API Proxy。

上傳 JAR 檔案

請確認 API Proxy 或環境層級中,存在具有所有必要類別的資源元素。詳情請參閱「資源檔案」。

  1. 如要在 API Proxy 層級上傳資源,請按一下「Resources」分頁中的「+」 (加號),然後選取「Import file」並從本機上傳檔案。檔案名稱應與 >ResourceURL< 元素相符,但不含 java:// 前置字元。

    在「資源」分頁中,選取「匯入檔案」。

  2. 如要讓資源在同一環境中供多個 API Proxy 使用,請將資源上傳至該環境。您必須使用 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 呼叫。

  3. 如要讓檔案可供機構中所有環境內的所有 API Proxy 使用,可以在 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」。