Java-Callout-Fehler beheben

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

Was ist ein Java-Callout?

Wenn Sie noch nicht mit Java-Callouts vertraut sind, sollten Sie mit dem Erstellen einer Java-Erweiterung beginnen.

Umgang mit Fehlern in einem Java-Callout

Beim Schreiben eines Java-Callouts kann es hilfreich sein, eine benutzerdefinierte Fehlerbehandlung in Ihrem Java-Code auszuführen. Sie möchten beispielsweise benutzerdefinierte Fehlermeldungen und Header zurückgeben und/oder Flussvariablen mit Fehlerinformationen im Proxy-Ablauf auf Edge festlegen.

Im Folgenden finden Sie ein einfaches Java-Callout-Beispiel, das einfache benutzerdefinierte Fehlerbehandlungen veranschaulicht. Im Beispiel wird eine benutzerdefinierte Fehlermeldung zurückgegeben, wenn eine Ausnahme auftritt. Außerdem wird der Fehler-Stacktrace in eine Ablaufvariable verschoben, was eine praktische Debugging-Methode sein kann.

Projekt herunterladen

Sie können dieses Projekt aus dem Apigee-Repository api-platform-samples auf GitHub herunterladen.

  1. Laden Sie api-platform-samples in Ihr System herunter oder klonen Sie es.
  2. Wechseln Sie in einem Terminal oder Codeeditor Ihrer Wahl zum api-platform-samples/doc-samples/java-error-Projekt.

Java-Beispielcode

Die Muster zur Fehlerbehandlung sind unkompliziert. Sie können Flussvariablen im aktuellen Edge-Ablaufkontext mit der Methode messageContext.setVariable() festlegen. Erstellen Sie eine ExecutionResult-Instanz und rufen Sie Methoden dafür auf, um die Fehlerantwort und die Header festzulegen, um benutzerdefinierte Fehlerinformationen zurückzugeben.

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;
        }
    }
}


Code mit Maven kompilieren

Das Projekt ist so eingerichtet, dass Sie es mit Maven kompilieren können. Wenn Sie javac verwenden möchten, fügen wir außerdem ein Beispiel hinzu.

  1. Maven muss installiert sein:
    mvn -version
    
  2. Führen Sie das java-error/buildsetup.sh-Skript aus: Mit diesem Skript werden die erforderlichen JAR-Abhängigkeiten in Ihrem lokalen Maven-Repository installiert.
  3. cd in das java-error/callout-Verzeichnis.
  4. Führen Sie Maven aus:
    mvn clean package
    
  5. Prüfen Sie bei Bedarf, ob die edge-custom-policy-java-error.jar-JAR-Datei nach java-error/apiproxy/resources/java kopiert wurde. Dies ist der erforderliche Speicherort für JAR-Dateien, die Sie mit einem Proxy bereitstellen möchten.

Kompilieren mit javac

Wenn Sie javac verwenden möchten, um den Code zu kompilieren, können Sie beispielsweise Folgendes ausführen (aus dem java-error-Verzeichnis). Die erforderlichen JAR-Dateien werden im java-error/lib-Verzeichnis für Sie bereitgestellt.

  1. cd in api-platform-samples/doc-samples/java-error.
  2. Achten Sie darauf, dass Ihr Pfad javac enthält.

    javac -version
    
  3. Führen Sie den folgenden javac-Befehl aus:

    javac -d . -classpath ./lib/expressions-1.0.0.jar:./lib/message-flow-1.0.0.jar:. callout/src/main/java/JavaProperties.java
    
  4. Kopieren Sie die JAR-Datei in das Verzeichnis apiproxy/resources/java. Dies ist der erforderliche Speicherort für JAR-Dateien, die Sie mit einem Proxy bereitstellen möchten.

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

Proxy bereitstellen und aufrufen

Ein Bereitstellungsskript wird im ./java-error-Verzeichnis bereitgestellt. Bevor Sie es ausführen, müssen Sie jedoch eine schnelle Einrichtung vornehmen.

  1. CD zu api-platform-samples/doc-samples/java-error
  2. Falls noch nicht geschehen, öffnen Sie die Datei ../../setup/setenv.sh und bearbeiten Sie sie wie angegeben mit Ihren Apigee-Kontoinformationen: Ihrem Nutzernamen (die mit Ihrem Konto verknüpfte E-Mail-Adresse), dem Namen Ihrer Organisation und der Domain, die Sie für API-Verwaltungsaufrufe verwenden. Für Edge Cloud ist die Domain beispielsweise https://api.enterprise.apigee.com. Ihre Domain kann sich jedoch unterscheiden, wenn Sie Edge Private Cloud verwenden.
  3. Speichern Sie die Datei setenv.sh.
  4. Führen Sie das Bereitstellungsskript aus:
    ./deploy.sh
    
  5. Wenn die Bereitstellung erfolgreich ist, führen Sie das Aufrufskript aus:
    ./invoke.sh
    

    Das Aufrufskript ruft einen cURL-Befehl auf, der so aussieht:

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

    Da der Aufruf keinen Suchparameter "name" enthält, löst der Java-Code einen Laufzeitfehler aus. Der Proxy gibt diese Nachricht und diesen Header zurück:

  • Fehlermeldung: Please specify a name parameter!
  • Header: ExceptionClass: java.lang.RuntimeException