如何处理 Java Callout 错误

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

什么是 JavaCallout?

如果您刚开始接触 Java callout,我们建议您从如何创建 Java callout 开始。

处理 Java callout 中的错误

在编写 Java callout 时,您可能需要在 Java 代码中进行自定义错误处理。例如,您可能希望在 Edge 上的代理流程中返回自定义错误消息和标头并/或设置包含错误信息的流变量。

我们将通过一个简单的 Java callout 示例来说明基本的自定义错误处理模式。发生异常时,示例会返回自定义错误消息。它还会将错误堆栈轨迹放入流变量中,这是一个便利的调试方法。

下载项目

为了简化操作,您可以从 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。要使用代理部署的 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 目录。要使用代理部署的 JAR 文件必须存放在该位置。

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

部署和调用代理

./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
    

    调用脚本会调用如下所示的 c网址 命令:

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

    由于调用不包含“name”查询参数,Java 代码会抛出运行时错误。代理会返回以下消息和标头:

  • 错误消息:Please specify a name parameter!
  • 标题:ExceptionClass: java.lang.RuntimeException