<ph type="x-smartling-placeholder"></ph>
您正在查看 Apigee Edge 文档。
转到
Apigee X 文档。 信息
什么是 JavaCallout?
如果您刚开始接触 Java callout,我们建议您从如何创建 Java callout 开始。
处理 Java callout 中的错误
在编写 Java callout 时,您可能需要在 Java 代码中进行自定义错误处理。对于 例如,您可能想要返回自定义错误消息和标头,以及/或者使用 Edge 上代理流中的错误信息。
我们将通过一个简单的 Java callout 示例来说明基本的自定义错误处理模式。发生异常时,示例会返回自定义错误消息。它还会将错误堆栈轨迹放入流变量中,这是一个便利的调试方法。
下载项目
为了简化操作,您可以从 GitHub 上的 Apigee api-platform-samples 代码库下载此项目。
- 将 api-platform-samples 下载或克隆到您的系统中。
- 在您选择的终端或代码编辑器中,转到
api-platform-samples/doc-samples/java-error
项目。
示例 Java 代码
错误处理模式非常简单。您可以在当前的
使用 messageContext.setVariable()
方法的边缘流上下文。要返回自定义错误信息,请构建一个 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
。要使用代理部署的 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 目录。要使用代理部署的 JAR 文件必须存放在该位置。
cp com/apigeesample/JavaProperties.class apiproxy/resources/java
部署和调用代理
./java-error
目录中提供了部署脚本。但在运行前,您需要进行快速设置。
- 使用 cd 命令转到
api-platform-samples/doc-samples/java-error
- 打开文件
../../setup/setenv.sh
并修改(如果您还没有这样做) 与您的 Apigee 账号信息所示:您的用户名(电子邮件地址 与您的账号关联的)、您的组织名称,以及用于创建 API 的域 管理通话例如,对于 Edge 云,域名为https://api.enterprise.apigee.com
;但如果您以同一域名 使用 Edge Private Cloud。 - 保存
setenv.sh
文件。 - 执行部署脚本:
./deploy.sh
- 如果部署成功,则执行调用脚本:
./invoke.sh
调用脚本会调用如下所示的 c网址 命令:
curl http://$org-$env.$api_domain/java-error
由于调用不包含“name”查询参数,Java 代码会抛出运行时错误。代理会返回以下消息和标头:
- 错误消息:
Please specify a name parameter!
- 标题:
ExceptionClass: java.lang.RuntimeException