如何處理 JavaCallout 政策錯誤

本頁內容適用於 ApigeeApigee Hybrid

查看 Apigee Edge 說明文件。

什麼是 Java 呼叫?

如果您是第一次使用 JavaCallout,建議先參閱「如何建立 Java 呼叫」。

處理 JavaCallout 政策中的錯誤

編寫 JavaCallout 政策時,您可能想在 Java 程式碼中進行自訂錯誤處理。舉例來說,您可能希望在 Apigee 的 Proxy 流程中,傳回自訂錯誤訊息和標頭,並/或使用錯誤資訊設定流程變數。

讓我們逐步瞭解簡單的 JavaCallout 政策範例,說明基本自訂錯誤處理模式。發生例外狀況時,這個範例會傳回自訂錯誤訊息。此外,這項政策也會將錯誤堆疊追蹤記錄放入流程變數,這項做法可做為實用的偵錯技巧。

下載專案

為簡化作業,您可以從 GitHub 上的 Apigee api-platform-samples 存放區下載這個專案。

  1. api-platform-samples 下載或複製到您的系統。
  2. 在所選的終端機或程式碼編輯器中,前往 api-platform-samples/doc-samples/java-error 專案。

Java 程式碼範例

錯誤處理模式很簡單。您可以使用 messageContext.setVariable() 方法,在目前的 Apigee 流程環境中設定流程變數。如要傳回自訂錯誤資訊,請建構 ExecutionResult 例項,並呼叫其中的方法來設定錯誤回應和標頭。

package com.apigeesample;

import com.apigee.flow.execution.ExecutionContext;
import com.apigee.flow.execution.ExecutionResult;
import com.apigee.flow.execution.spi.Execution;
import com.apigee.flow.message.MessageContext;
import com.apigee.flow.execution.Action;

import org.apache.commons.lang.exception.ExceptionUtils;


public class JavaError implements Execution {
    public ExecutionResult execute(MessageContext messageContext, ExecutionContext executionContext) {

        try {

                String name = messageContext.getMessage().getHeader("username");

                if (name != null && name.length()>0) {
                        messageContext.getMessage().setContent("Hello, " + name + "!");
                        messageContext.getMessage().removeHeader("username");

                } else {
                        throw new RuntimeException("Please specify a name parameter!");
                }

                return ExecutionResult.SUCCESS;

        } catch (RuntimeException ex) {

            ExecutionResult executionResult = new ExecutionResult(false, Action.ABORT);

            //--Returns custom error message and header
            executionResult.setErrorResponse(ex.getMessage());
            executionResult.addErrorResponseHeader("ExceptionClass", ex.getClass().getName());

            //--Set flow variables -- may be useful for debugging.
            messageContext.setVariable("JAVA_ERROR", ex.getMessage());
            messageContext.setVariable("JAVA_STACKTRACE", ExceptionUtils.getStackTrace(ex));
            return executionResult;
        }
    }
}


使用 Maven 編譯程式碼

專案已設定完成,因此您可以使用 Maven 編譯。如果您想使用 javac,我們也會提供範例。

  1. 請確認您已安裝 Maven:
    mvn -version
  2. 執行指令碼 java-error/buildsetup.sh。這個指令碼會在您的本機 Maven 存放區中安裝必要的 JAR 依附元件。
  3. cd 至 java-error/callout 目錄。
  4. 執行 Maven:
    mvn clean package
  5. 如要確認 JAR 檔案 edge-custom-policy-java-error.jar 是否已複製到 java-error/apiproxy/resources/java,這是您要透過 Proxy 部署的 JAR 檔案必要位置。

部署及呼叫 Proxy

./java-error 目錄中提供部署指令碼。但執行前,請先完成快速設定。

  1. cd 至 api-platform-samples/doc-samples/java-error
  2. 如要部署 Proxy,最簡單的方法是將 Proxy 封裝在 ZIP 檔案中,然後將 Proxy 套件上傳至 Apigee 機構的環境。請參閱「建立 API Proxy」。 請務必使用「上傳 Proxy 組合」選項。另請參閱 Apigee 社群中的「 上傳 API Proxy 組合的訣竅」。
  3. 部署 Proxy 後,請嘗試呼叫:
    curl  https://$HOSTNAME/java-error

    由於呼叫不含「name」查詢參數,Java 程式碼會擲回執行階段錯誤。Proxy 會傳回這則訊息和標頭:

  • 錯誤訊息:Please specify a name parameter!
  • 標題:ExceptionClass: java.lang.RuntimeException