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 至測試環境時發生錯誤。

原因

如果 API 代理程式或環境層級中,沒有 JavaCallout 政策<ResourceURL> 元素中指定的資源,則 API 代理程式的部署作業會失敗。

診斷

  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 代理程式編輯器的「Navigator」窗格中的「Resources」分頁,查看在 API 代理程式層級上傳的所有資源。在本範例中,API 代理程式沒有上傳任何資源。

      API Proxy 編輯器的「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 要求設定環境變數」。

      如果您收到的回應狀態碼為 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 代理程式或環境層級中顯示存在,仍可能發生這個錯誤。

診斷

  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 代理程式層級上傳。

    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」。

    如果您收到的回應狀態碼為 404,表示環境層級缺少資源。

解決方法

  1. 如果您判斷資源位於 API 代理程式或環境層級,請按照步驟 2 所述刪除資源,然後重新上傳。如果您只有一個網域,請跳到步驟 3。
  2. 如要刪除 API 代理程層級的資源,請前往 API 代理程編輯器的「Navigator」窗格中的「Resources」分頁,然後按一下資源旁邊的「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. 在適當層級 (API 代理程式或環境層級) 上傳 JAR 檔案

  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 檔案已損毀/部分上傳。
缺少類別檔案 錯誤中指出的 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. 判斷 JAR 檔案是否應包含上述步驟 1 中所述的類別,且無法例項化。
  2. 檢查是否在 API Proxy 或環境層級上傳特定 JAR 檔案。如果 JAR 檔案未上傳至任何層級,請參閱「解決方法」。
  3. 如果您已上傳 JAR 檔案,請參閱「原因:毀損的 JAR 檔案」一節。

解決方法

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

原因:毀損的 JAR 檔案

診斷

  1. 判斷 JAR 檔案是否包含無法例項化的類別 (請參閱上述步驟 1)。
  2. 檢查特定 JAR 檔案是否已損毀。例如,如果檔案已損毀或部分上傳,您就無法解壓縮檔案。如果檔案已損毀,請前往「解析度」一節。
  3. 如果 JAR 檔案並未損毀,請參閱「原因:缺少類別檔案」

解決方法

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

原因:缺少類別檔案

診斷

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

解決方法

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

上傳 JAR 檔案

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

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

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

  2. 如果您希望資源可供同一個環境中的多個 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 呼叫。

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