您目前查看的是 Apigee Edge 說明文件。
前往 Apigee X 說明文件。 info
什麼是 Java 呼叫?
如果您是第一次使用 Java 呼叫,建議先參閱「如何建立 Java 呼叫」。
處理 Java 呼叫中的錯誤
撰寫 Java Callout 時,您可能想在 Java 程式碼中進行自訂錯誤處理。舉例來說,您可能想在 Edge 上的 Proxy 流程中,傳回自訂錯誤訊息和標頭,及/或使用錯誤資訊設定流程變數。
讓我們逐步瞭解簡單的 Java Callout 範例,說明基本自訂錯誤處理模式。發生例外狀況時,範例會傳回自訂錯誤訊息。此外,這項政策也會將錯誤堆疊追蹤記錄放入流程變數,這項實用技巧有助於偵錯。
下載專案
為簡化作業,您可以從 GitHub 上的 Apigee api-platform-samples 存放區下載這個專案。
- 將 api-platform-samples 下載或複製到您的系統。
- 在所選的終端機或程式碼編輯器中,前往
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,我們也會提供範例。
- 請確認已安裝 Maven:
mvn -version
- 執行指令碼
java-error/buildsetup.sh。這段指令碼會在您的本機 Maven 存放區中安裝必要的 JAR 依附元件。 - cd 至
java-error/callout目錄。 - 執行 Maven:
mvn clean package
- 如要確認 JAR 檔案
edge-custom-policy-java-error.jar是否已複製到java-error/apiproxy/resources/java,這是要透過 Proxy 部署的 JAR 檔案必要位置。
使用 javac 編譯
如要使用 javac 編譯程式碼,可以執行類似下列的動作 (從 java-error 目錄)。系統會在 java-error/lib 目錄中提供必要的 JAR 檔案。
- cd 到
api-platform-samples/doc-samples/java-error。 - 請確認路徑中含有 javac。
javac -version
- 執行下列 javac 指令:
javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/JavaProperties.java
- 將 JAR 檔案複製到 apiproxy/resources/java 目錄。這是要透過 Proxy 部署的 JAR 檔案必要位置。
cp com/apigeesample/JavaProperties.class apiproxy/resources/java
部署及呼叫 Proxy
./java-error 目錄中提供部署指令碼。但執行前,請先完成快速設定。
- cd 至
api-platform-samples/doc-samples/java-error - 如果尚未開啟檔案
../../setup/setenv.sh並編輯,請按照指示使用 Apigee 帳戶資訊編輯檔案:使用者名稱 (與帳戶相關聯的電子郵件地址)、機構名稱,以及用於發出 API 管理呼叫的網域。舉例來說,Edge Cloud 的網域是https://api.enterprise.apigee.com,但如果您使用 Edge Private Cloud,網域可能會有所不同。 - 儲存
setenv.sh檔案。 - 執行部署指令碼:
./deploy.sh
- 如果部署成功,請執行叫用指令碼:
./invoke.sh
叫用指令碼會呼叫類似下列的 cURL 指令:
curl http://$org-$env.$api_domain/java-error
由於呼叫未包含「name」查詢參數,因此 Java 程式碼會擲回執行階段錯誤。Proxy 會傳回這則訊息和標頭:
- 錯誤訊息:
Please specify a name parameter! - 標題:
ExceptionClass: java.lang.RuntimeException