JavaCallout ポリシーのデプロイエラーのトラブルシューティング

現在、ApigeeApigee ハイブリッドのドキュメントを表示しています。
Apigee Edge のドキュメントを表示する

ResourceDoesNotExist

エラー メッセージ

Apigee UI または 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. 環境とリソース名を特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、環境は test で、<ResourceURL> 要素で使用されているリソース名は 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 プロキシ エディタの [Navigator] ペインで [Resources] タブに移動すると、API プロキシレベルでアップロードされたすべてのリソースが表示されます。この例では、API プロキシにはアップロードされたリソースがありません。

      API プロキシ エディタの [Navigator] ペインにある [Resources] タブ。

    • リソースは環境レベルで利用できます。詳しくは、リソース ファイルをご覧ください。

      • リソースが環境レベルで存在するかどうかを判別するには、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 リクエストの環境変数の設定をご覧ください。

      これらの API のレスポンスとして 404 ステータス コードを受信した場合、環境レベルではリソースがありません。

    リソースが API プロキシレベルと環境レベルで使用可能でない場合、デプロイエラーが返されます。

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

解決策

<ResourceURL> 要素で指定されたリソースが API プロキシまたは環境レベルで存在するかどうかを確認します。詳細については、リソースの管理をご覧ください。

上記の JavaCallout ポリシーの例を修正するには、適切なレベル(API プロキシレベルまたは環境レベル)で JAR ファイルをアップロードしてください。

NoResourceForURL

エラー メッセージ

Apigee UI または 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. 環境とリソース名を特定します。この情報はエラー メッセージにあります。たとえば、次のエラーでは、環境名は test で、<ResourceURL> 要素で使用されているリソース名は 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 プロキシレベルまたは環境レベルでアップロードされていることを確認します。以下の例では、リソース myresource.jar が 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 の使用をご覧ください。

    これらの API のレスポンスとして 404 ステータス コードを受信した場合、環境レベルではリソースがありません。

解決策

  1. リソースが API プロキシレベルまたは環境レベルで存在すると判別できた場合は、リソースを削除し、ステップ 2 の説明に従ってリソースを再アップロードします。それ以外の場合は、手順 3 に進みます。
  2. API プロキシレベルでリソースを削除するには、API プロキシ エディタの [Navigator] ペインで [Resources] タブに移動し、以下に示すようにリソースの横にある [X] ボタンをクリックします。

    API プロキシレベルでリソースを削除するには、[Delete] をクリックします。

    環境のリソースを削除するには、以前に診断ステップで使用していた 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 の UI または 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. 特定の JAR ファイルが API プロキシレベルまたは環境レベルでアップロードされたかどうかを確認します。JAR ファイルがどのレベルにもアップロードされていない場合は、解決策に進みます。
  3. JAR ファイルがアップロードされている場合は、原因: JAR ファイルが破損をご覧ください。

解決策

  1. JAR ファイルが破損しているか部分的にアップロードされた場合は、JAR を再作成して、適切なレベル(API プロキシレベルまたは環境レベル)で JAR ファイルをアップロードします。
  2. API プロキシを再デプロイします。

原因: JAR ファイルが破損

診断

  1. インスタンス化できなかったクラス(上記のステップ 1 で特定)が含まれることになっている JAR ファイルを判別します。
  2. 特定の JAR ファイルが破損しているかどうかを確認します。たとえば、ファイルが解凍できない場合は、ファイルが破損していることや、部分的にアップロードされていることが原因です。ファイルが破損している場合は、解決策に進みます。
  3. JAR ファイルが破損していない場合は、原因: クラスファイルがないをご覧ください。

解決策

  1. 破損した JAR ファイルを再作成して、適切なレベル(API プロキシレベルまたは環境レベル)で JAR ファイルをアップロードします。
  2. API プロキシを再デプロイします。

原因: クラスファイルがない

診断

  1. 特定の Java クラスファイル(上記のステップ 1 で特定)が、>ResourceURL< または依存 JAR ファイルのいずれかで指定された JAR ファイルに含まれているかどうかを確認します。
  2. クラスファイルがどの JAR ファイルにも存在しない場合、これがエラーの原因であると判断します。解決策に進みます。
  3. JavaCallout ポリシーで指定された JAR ファイルにクラスファイルが存在する場合は、このエラーを引き起こす原因となる Java コードまたは依存クラスに問題があるはずです。サポートが必要な場合は、Apigee サポートにお問い合わせください。

解決策

  1. 欠落しているクラスファイルを含む JAR を再作成して、適切なレベル(API プロキシレベルまたは環境レベル)で JAR ファイルをアップロードします。
  2. API プロキシを再デプロイします。

JAR ファイルをアップロードする

すべての必要なクラスを含むリソース要素が API プロキシレベルまたは環境レベルで存在することを確認します。詳しくは、リソース ファイルをご覧ください。

  1. API プロキシレベルでリソースをアップロードするには、[Resources] タブで +(プラス記号)をクリックして、[Import file] を選択し、ローカルマシンからファイルをアップロードします。ファイル名は >ResourceURL< 要素と一致する必要がありますが、java:// 接頭辞は付けません。

    [Resources] タブで、[Import file] を選択します。

  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 の使用をご覧ください。