如何處理 Java 呼叫錯誤

您正在查看 Apigee Edge 說明文件。
查看 Apigee X 說明文件
資訊

什麼是 Java 呼叫?

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

處理 Java 呼叫中的錯誤

撰寫 Java 呼叫時,建議您透過 Java 程式碼自訂錯誤處理。例如,您可能會想要傳回自訂錯誤訊息和標頭,以及/或是在 Edge 的 Proxy 流程中,使用錯誤資訊來設定流程變數。

以下逐步說明簡單的 Java 呼叫範例,說明基本的自訂錯誤處理模式。系統會在發生例外狀況時傳回自訂錯誤訊息。此外,還會將錯誤堆疊追蹤置於資料流變數中,因此是實用的偵錯技巧。

下載專案

為簡化流程,您可以從 GitHub 的 Apigee api-platform-samples 存放區下載這項專案。

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

Java 程式碼範例

錯誤處理模式相當簡單。您可以使用 messageContext.setVariable() 方法,在目前 Edge 流程結構定義中設定流程變數。如要傳回自訂錯誤資訊,請建構 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 檔案必要位置。

使用 Javac 編譯

如果您想使用 javac 編譯程式碼,可以執行類似下方的操作 (從 java-error 目錄)。java-error/lib 目錄中會為您提供所需的 JAR 檔案。

  1. cd 重新命名為 api-platform-samples/doc-samples/java-error
  2. 請確認路徑中有 Javac。

    javac -version
    
  3. 執行下列 javac 指令:

    javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/JavaProperties.java
    
  4. 將 JAR 檔案複製到 apiproxy/resources/java 目錄。這是您要透過 Proxy 部署的 JAR 檔案必要位置。

    cp com/apigeesample/JavaProperties.class apiproxy/resources/java
    

部署及呼叫 Proxy

./java-error 目錄中會提供部署指令碼。但在執行前,您必須先快速設定。

  1. CD 至 api-platform-samples/doc-samples/java-error
  2. 如果尚未開啟檔案 ../../setup/setenv.sh,請先開啟檔案,然後依照 Apigee 帳戶資訊 (與帳戶相關聯的電子郵件地址)、貴機構的名稱,以及用於執行 API 管理呼叫的網域來編輯該檔案。舉例來說,若為 Edge Cloud,網域為 https://api.enterprise.apigee.com;不過,如果您使用的是 Edge Private Cloud,網域可能會不同。
  3. 儲存 setenv.sh 檔案。
  4. 執行部署指令碼:
    ./deploy.sh
    
  5. 如果部署成功,請執行叫用指令碼:
    ./invoke.sh
    

    叫用指令碼呼叫的 cURL 指令如下所示:

    curl  http://$org-$env.$api_domain/java-error
    

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

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