JavaCallout 政策部署错误问题排查

您正在查看 ApigeeApigee Hybrid 文档。
查看 Apigee Edge 文档。

ResourceDoesNotExist

错误消息

通过 Apigee 界面或 API 部署 API 代理失败并显示以下错误消息:

Error Deploying Revision <var>revision_number</var> to <var>environment</var>
Resource with name <var>ResourceURL</var> and type java does not exist.

错误消息示例

Error Deploying Revision 1 to test
Resource with name myresource.jar and type java does not exist.

错误屏幕截图示例

将修订版本 1 部署到测试时出错。

原因

如果在 JavaCallout 政策<ResourceURL> 元素中指定的资源在 API 代理或环境级别不存在,则 API 代理的部署将失败。

诊断

  1. 标识环境和资源名称。您可以在错误消息中找到此信息。例如,在以下错误中,环境为 testResourceURL> 元素中使用的资源名称为 myresource.jar

    Error Deploying Revision 1 to test
    Resource with name myresource.jar and type java does not exist.
    
  2. 确定使用上述第 1 步中标识的资源的 JavaCallout 政策

    例如,以下政策将 ResourceURL> 的值指定为 myresource.jar,该值与错误消息中的值相匹配:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <JavaCallout name="hello-java">
        <ClassName>com.apigeesample.HelloJava</ClassName>
        <ResourceURL>java://myresource.jar</ResourceURL>
    </JavaCallout>
    
  3. 确定资源是否属于在环境级别失败或上传的 API 代理。如果不是,则这是错误原因。

    • 导航到 API 代理编辑器导航窗格中的“资源”标签页,以查看在 API 代理级别上传的所有资源。在此示例中,API 代理未上传任何资源。

      导航窗格中的 API 代理编辑器的“资源”标签页。

    • 资源在环境级别可用。如需了解详情,请参阅资源文件

      • 如需确定环境级别是否存在资源,请使用 curl 发出以下 API 调用:

        curl \
        "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \
        -H "Authorization: Bearer $TOKEN"

        按照获取 OAuth 2.0 访问令牌中的说明,将 $TOKEN 设置为您的 OAuth 2.0 访问令牌。如需了解此示例中使用的 curl 选项,请参阅使用 curl。如需了解所使用的环境变量,请参阅为 Apigee API 请求设置环境变量

      如果您收到 404 状态代码作为这些 API 的响应,那么环境级别缺少资源。

    如果资源在 API 代理和环境级别不可用,系统将返回部署错误:

    Resource with name myresource.jar and type java does not exist.
     ```
    

解决方法

确保在 <ResourceURL> 元素中指定的资源在 API 代理或环境级别存在。如需了解详情,请参阅管理资源

如需更正上面所示的 JavaCallout 政策示例,请在适当的级别(API 代理或环境级别)上传 JAR 文件

NoResourceForURL

错误消息

通过 Apigee 界面或 API 部署 API 代理失败并显示以下错误消息:

Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL <var>ResourceURL</var>

错误消息示例

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar

错误屏幕截图示例

部署以进行环境测试时出错。

原因

即使资源文件在 API 代理或环境级别显示为存在,也可能已损坏或部分上传,在这种情况下可能会发生此错误。

诊断

  1. 标识环境和资源名称。您可以在错误消息中找到此信息。例如,在以下错误中,环境名称为 testResourceURL> 元素中使用的资源名称为 myresource.jar

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Could not locate a resource with URL java://myresource.jar
    
  2. 确保在 API 代理或环境级别上传了资源。在以下示例中,您可以看到在 API 代理级别上传了资源 myresource.jar

    API 代理资源。

    资源在环境级别可用。如需了解详情,请参阅资源文件

    如需确定环境级别是否存在资源,请使用 curl 发出以下 API 调用:

    curl \
    "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \
    -H "Authorization: Bearer $TOKEN"

    按照获取 OAuth 2.0 访问令牌中的说明,将 $TOKEN 设置为您的 OAuth 2.0 访问令牌。 如需了解此示例中使用的 curl 选项,请参阅使用 curl

    如果您收到 404 状态代码作为这些 API 的响应,那么环境级别缺少资源。

解决方法

  1. 如果您确定 API 代理或环境级别存在资源,则删除资源并按照第 2 步中的说明重新上传资源。否则,跳到第 3 步。
  2. 如需删除 API 代理级别的资源,请导航到 API 代理编辑器导航窗格中的“资源”标签页,然后点击资源旁边的“X”按钮(如下所示)。

    如需在 API 代理级别删除资源,请点击“删除”。

    如需删除环境中的资源,请对先前在诊断步骤中使用的 API 调用使用 DELETE 动词。例如,如需删除环境级别的资源,请输入以下命令:

    curl -X DELETE \
    "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles/java/myresource.jar" \
    -H "Authorization: Bearer $TOKEN"

    按照获取 OAuth 2.0 访问令牌中的说明,将 $TOKEN 设置为您的 OAuth 2.0 访问令牌。 如需了解此示例中使用的 curl 选项,请参阅使用 curl

  3. 在相应级别(API 代理或环境级别)上传 JAR 文件

  4. 如果重新上传资源不起作用,请联系 Apigee 支持团队

JavaCalloutInstantiationFailed

错误消息

通过 Apigee 界面或 API 部署 API 代理失败并显示以下错误消息:

Error in deployment for environment <var>environment</var>
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class <var>class_name</var>

Error in deployment for environment <var>environment</var>.
The revision is deployed and traffic can flow, but flow may be impaired. Failed to instantiate the JavaCallout Class <var>class_name</var>

错误消息示例

Error in deployment for environment test
The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class

错误屏幕截图示例

部署以进行环境测试时出错。

原因

下面是此错误的典型原因

原因 说明
缺少 JAR 文件 系统不会上传包含错误中所标识的 Java 类的 JAR 文件。
JAR 文件已损坏 包含错误中所标识的 Java 类的 JAR 文件已损坏/部分上传。
缺少类文件 错误消息中标识的 Java 类文件不属于 >ResourceURL< 或相关 JAR 文件中指定的 JAR 文件。
Java 代码问题 代码存在错误,如缺少构造函数、代码依赖项问题或其他问题。

常用诊断步骤

  1. 标识环境名称和无法导入的类。例如,在以下错误消息中,环境名称为 test,类名称为 my.class

    Error in deployment for environment test
    The revision is deployed, but traffic cannot flow. Failed to instantiate the JavaCallout Class my.class
    
    

原因:缺少 JAR 文件

诊断

  1. 确定应包含类(在上述第 1 步中标识)且不能实例化的 JAR 文件。
  2. 检查是否在 API 代理或环境级别上传了特定 JAR 文件。如果 JAR 文件未上传到任何级别,请转到“解决方法”。
  3. 如果 JAR 文件已上传,请转到原因:JAR 文件损坏

解决方法

  1. 如果 JAR 文件已损坏或部分上传,则在相应级别(API 代理或环境级别)重新构建 JAR 并上传 JAR 文件
  2. 重新部署 API 代理。

原因:JAR 文件损坏

诊断

  1. 确定应包含类(在上述第 1 步中标识)且不能实例化的 JAR 文件。
  2. 检查特定 JAR 文件是否已损坏。例如,如果您由于文件已损坏或部分上传而无法解压缩文件。如果已损坏,请转到“解决方法”。
  3. 如果 JAR 文件未损坏,请转到原因:缺少类文件

解决方法

  1. 在相应级别(API 代理或环境级别)重新构建已损坏的 JAR 文件并上传 JAR 文件
  2. 重新部署 API 代理。

原因:缺少类文件

诊断

  1. 检查特定的 Java 类文件(上面第 1 步中标识)是否属于在 >ResourceURL< 或任何相关 JAR 文件中指定的 JAR 文件。
  2. 如果任何 JAR 文件中都不存在类文件,则表示您已确定错误原因。转到“解决方法”。
  3. 如果类文件存在于在 JavaCallout 政策中指定的一个 JAR 文件中,则是 Java 代码或依赖类引发此错误。如需帮助,请与 Apigee 支持团队联系。

解决方法

  1. 在相应级别(API 代理或环境级别)使用缺少的类文件重新构建 JAR 并上传 JAR 文件
  2. 重新部署 API 代理。

上传 JAR 文件

确保 API 代理或环境级别存在包含所有必要类的资源元素。如需了解详情,请参阅资源文件

  1. 如需在 API 代理级别上传资源,请点击“资源”标签页上的 +(加号),选择导入文件,然后从本地机器上传文件。文件名应与 >ResourceURL< 元素匹配,但不含 java:// 前缀。

    在“资源”标签页中,选择“导入文件”。

  2. 如果您希望某个资源可用于同一环境中的多个 API 代理,请将相应资源上传到该环境中。您需要使用 Apigee API,如资源文件中所述。

    例如,从本地机器输入以下 API 调用,以在环境级别上传指定的文件:

    curl -H "Content-Type: application/octet-stream" \
    -X POST  -H "Authorization: Bearer $TOKEN" --data-binary @{classes.jar} \
    "https://apigee.googleapis.com/v1/organizations/$ORG/environments/$ENV/resourcefiles?name=myresouce.jar&type=java"

    按照获取 OAuth 2.0 访问令牌中的说明,将 $TOKEN 设置为您的 OAuth 2.0 访问令牌。 如需了解此示例中使用的 curl 选项,请参阅使用 curl

    从文件所在的目录中发出 API 调用。

  3. 如需使文件可用于组织的所有环境内的所有 API 代理,您可以省略基本路径中的环境详细信息。例如:

    curl -H "Content-Type: application/octet-stream" \
    -X POST  -H "Authorization: Bearer $TOKEN" --data-binary @{classes.jar} \
    "https://apigee.googleapis.com/v1/organizations/$ORG/resourcefiles?name=myresouce.jar&type=java"

    按照获取 OAuth 2.0 访问令牌中的说明,将 $TOKEN 设置为您的 OAuth 2.0 访问令牌。 如需了解此示例中使用的 curl 选项,请参阅使用 curl