Java コールアウト エラーの処理方法

Java Callout とは

Java コールアウトを初めて使用する場合は、Java コールアウトの作成方法から始めることをおすすめします。

Java コールアウトのエラー処理

Java コールアウトを作成すると、Java コードでカスタムエラー処理を行えます。たとえば、カスタムのエラー メッセージおよびヘッダーを返したり、エラー情報を含むフロー変数を Edge のプロキシフローに設定したりできます。

基本的なカスタムエラー処理のパターンを示す単純な Java コールアウトの例を見てみましょう。このサンプルは、例外が発生すると、カスタムのエラー メッセージを返します。また、手軽なデバッグの方法として、エラー スタックトレースをフロー変数に格納します。

プロジェクトをダウンロードする

手順を簡易化するために、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 を実行します。このスクリプトにより、必要な JAR 依存関係がローカルの Maven リポジトリにインストールされます。
  3. cd で java-error/callout ディレクトリに移動します。
  4. Maven を実行します。
        mvn clean package
        
  5. 必要であれば、JAR ファイル edge-custom-policy-java-error.jarjava-error/apiproxy/resources/java にコピーされていることを確認します。これは、プロキシでデプロイする JAR ファイル用に必要な場所です。

javac でコンパイルする

javac を使用してコードをコンパイルする場合は、(java-error ディレクトリから)次のようなことができます。必要な JAR ファイルは、java-error/lib ディレクトリに用意されています。

  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
        

プロキシのデプロイと呼び出し

deploy スクリプトは ./java-error ディレクトリにあります。ただし、スクリプトを実行する前に、クイック設定を行う必要があります。

  1. cd で api-platform-samples/doc-samples/java-error に移動します。
  2. ../../setup/setenv.sh をまだ編集していない場合はこのファイルを開いて、ユーザー名(アカウントに関連付けられたメールアドレス)、組織名、API 管理呼び出しを行うために使用するドメインを、Apigee アカウント情報に従って編集します。たとえば、Edge クラウドの場合、ドメインは https://api.enterprise.apigee.com です。ただし、Edge Private Cloud を使用している場合は、ドメインが異なる場合があります。
  3. setenv.sh ファイルを保存します。
  4. deploy スクリプトを実行します。
        ./deploy.sh
        
  5. デプロイが成功したら、invoke スクリプトを実行します。
        ./invoke.sh
        

    invoke スクリプトは、次のような cURL コマンドを呼び出します。

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

    この呼び出しには "name" クエリ パラメータが含まれていないため、Java コードは実行時エラーをスローします。プロキシは次のメッセージとヘッダーを返します。

  • エラー メッセージ: Please specify a name parameter!
  • ヘッダー: ExceptionClass: java.lang.RuntimeException