Anzeige des Java Error Stack in Oracle Forms (Version 2.0) Juni 2008 Autoren: Jürgen Menge / Thomas Robert Seite 1 von 7 Anzeige des Java Error Stack in Forms Version 2.0 Oracle Forms bietet seit der Version 6i die Möglichkeit, serverseitig Java-Klassen zu importieren und über einen automatisch generierten PL/SQL-Wrapper Klassen-Methoden aus der Anwendungslogik der Form aufzurufen. Dieses Verfahren eignet sich zum Beispiel für: • den Aufruf eigener Java-Klassen • die Einbindung von Java APIs (Mail, BPEL, BI Publisher) • den Aufruf von Web Services. Hat man die Form erfolgreich entwickelt, steht man jedoch vor einer größeren Hürde. In der Laufzeit-Umgebung müssen alle referenzierten Klassen im CLASSPATH angegeben sein. Anderenfalls stellt die Anwendung mit einer „... raised unhandled exception ORA-105100“ bzw. „... raised unhandled exception ORA-105101“ ihren Dienst ein, wenn der fragliche Java-Code aufgerufen wird. Wie kann man nun erfahren, welche Klassen bzw. welche Archive für eine erfolgreiche Ausführung fehlen ? Duncan Mills und Jan Carlin haben in ihren Blogs ein Verfahren beschrieben, wie die JavaFehlermeldungen (Java Error Stack) in der Form angezeigt werden können: http://groundside.com/blog/DuncanMills.php?title=exception_handling_in_forms_java_integra&more=1&c=1&tb=1&pb=1 http://groundside.com/blog/JanCarlin.php?title=extracting_a_stack_trace_from_a_java_exc&more=1&c=1&tb=1&pb=1 Allerdings musste der Beispiel-Code modifiziert werden, damit die Fehler tatsächlich sichtbar wurden und nicht die nächste Unhandled Exception bei der Aufbereitung des Fehlertextes auftrat. Die folgenden Erläuterungen beziehen sich auf Oracle Forms ab der Version 9.0.4. Für die Version Forms 9.0.2 wird eine Modifikation des Codes im letzten Abschnitt beschrieben. Seite 2 von 7 Anzeige des Java Error Stack in Forms Version 2.0 Anzeige des Java Error Stack (ab Forms 9.0.4) Hier kurz zusammengefasst die notwendigen Schritte: 1. Aufruf des Forms Builder Die zu importierenden Klassen müssen sich im CLASSPATH des Forms Builder befinden. Hierzu gibt es zwei Wege: • Erweiterung des Registry-Schlüssels FORMS_BUILDER_CLASSPATH • Aufruf des Forms Builders aus einem Script und Setzen der Umgebungs-variable FORMS_BUILDER_CLASSPATH unmittelbar vor dem Aufruf. Das folgende Script soll als Beispiel dienen: set FORMS_BUILDER_CLASSPATH=C:\ora_ods_1012\jdk\jre\lib\rt.jar;C:\ora_ods_1012\forms\java\frmbld.jar;C:\o ra_ods_1012jlib\importer.jar;C:\ora_ods_1012\jlib\debugger.jar;C:\ora_ods_1012\jlib\utj.jar;C:\ora_ods_1012\jlib\d fc.jar;C:\ora_ods_1012\jlib\help4.jar;C:\ora_ods_1012\jlib\oracle_ice.jar;C:\ora_ods_1012\jlib\jewt4.jar;C:\ora_ods _1012\jlib\ewt3.jar;C:\ora_ods_1012\jlib\share.jar;C:\ora_ods_1012\forms\java\frmwebutil.jar;C:\ora_ods_1012\for ms\java\frmall.jar;C:\ora_ods_1012\soap\lib\soap.jar;C:\JDev10132\webservices\lib\wsclient.jar;C:\ora_ods_1012\f orms\demos\jars\FormsGraph.jar C:\ora_ods_1012\bin\frmbld.exe Neben den Klassen, die man direkt verwenden will, brauchen wir für die Fehleranzeige die Klassen: • java.lang.Exception • java.lang.StackTraceElement Beide befinden sich in der Datei rt.jar im Oracle Home der Oracle Developer Suite (OH\jdk\jre\lib). 2. Import der benötigten Klassen in die Form Dazu rufen wir aus dem Menü des Forms Builders über Program => Import Java Classes ... den Java Importer auf und importieren: • die Klassen, die wir direkt aufrufen wollen • java.lang.Exception • java.lang.StackTraceElement Die beiden Klassen können direkt in das Textfeld Import Classes eingegeben werden. Seite 3 von 7 Anzeige des Java Error Stack in Forms Version 2.0 Vor dem Import müssen im Java Importer die Optionen Include inherited methods/fields Include get/set for public Fields aktiviert werden. Befinden sich die Klassen nicht im FORMS_BUILDER_CLASSPATH, treten beim Import Fehler auf. 3. Schreiben der Anwendungslogik Für alle importierten Klassen wird jeweils ein PL/SQL-Package generiert. In der Form können nun Methoden der importierten Klasse aufgerufen werden, indem die entsprechenden PL/SQL Procedures bzw. Functions in der Programmlogik (Trigger, Program Units) verwendet werden. Seite 4 von 7 Anzeige des Java Error Stack in Forms Version 2.0 4. Einbau des Exception Handlers zur Anzeige der Fehlermeldungen Folgender Programmcode muss im Trigger bzw. der Program Unit eingefügt werden, in dem Methoden der importierten Klasse aufgerufen werden. < An wendungsl ogik> exception --check for ORA-105100 when ORA_JAVA.JAVA_ERROR then message('Unable to call out to Java, ' ||ORA_JAVA.LAST_ERROR); return; --check for ORA-105101 when ORA_JAVA.EXCEPTION_THROWN then raisedException := exception_.new(ORA_JAVA.LAST_EXCEPTION); begin :control.excep := 'Exception: '||Exception_.toString(raisedException); exception when ORA_JAVA.JAVA_ERROR then message('Unable to call out to Java, ' ||ORA_JAVA.LAST_ERROR); return; end; --Get an array of StackTraceElement from the Exception stack_trace:=Exception_.getStackTrace(raisedException); --Loop over all the Elements for i in 0..ora_java.get_array_length(stack_trace) loop --Get each Element stackTrcElement:=ora_java.get_object_array_element(stack_trace, i); --Make a string out of it and add it to the error field :control.excep:=:control.excep||(10)||stackTraceElement.toString(stackTrcElement); end loop; ORA_JAVA.CLEAR_EXCEPTION; return; when OTHERS then message('Problem!'); return; end; Die hervorgehobenen Zeilen machen den Unterschied zu den genannten Blogs deutlich. Die innere Exception fängt Fehler ab, die beim Aufruf der Methode Exception_.troString auftreten können. Zur Anzeige der Fehlermeldungen wird ein mehrzeiliges Textfeld im Control-Block angelegt (CONTROL.EXCEP). 5. Festlegen einer Konfiguration und eines Environment Files Für den Test ist es zweckmäßig in der Datei formsweb.cfg eine benannte Konfiguration einzurichten und dieser eine eigene Environment-Datei zuzuordnen. [webservice] envFile=webservice.env ... Seite 5 von 7 Anzeige des Java Error Stack in Forms Version 2.0 In der Environment-Datei müssen in der Umgebungsvariable CLASSPATH alle Verzeichnisse bzw. jar-Archive mit den benötigten Klassen aufgelistet sein. 6. Testen der Form auf Basis der festgelegtenKonfiguration Aufruf der Form im Browser mit der festglegten Konfiguration http://<host>:<port>/forms/frmservlet?config=webservice& ... Beim Auführen von Methoden der importierten Klasse werden auftretende Fehler im Textfeld angezeigt. In den meisten Fällen wird eine ‚Class not found’-Meldung darauf hinweisen, dass im CLASSPATH noch Einträge fehlen. Zur Laufzeit kann der CLASSPATH in der Environment-Datei jederzeit erweitert werden, ohne den OC4J für Forms neu zu starten. Lediglich die Form muss beendet und neu aufgerufen werden. So ist ein relativ rasches Arbeiten möglich, um alle benötigten Klassen zu finden und im CLASSPATH festzulegen. Seite 6 von 7 Anzeige des Java Error Stack in Forms Version 2.0 Anzeige des Java Error Stack (Forms 9.0.2) Da Oracle Forms 9.0.2 mit Java 1.3 ausgeliefert wird, steht für die Klasse Exception kein Konstruktor zur Verfügung, dem die originale Exception übergeben werden kann. In diesem Fall sollte man anstelle von java.lang.Exception die Klasse java.lang.Throwable importieren. Man kann jetzt im Code des Exception Handling (Schritt 4) die Zeile: raisedException := exception_.new(ORA_JAVA.LAST_EXCEPTION); durch message(throwable.toString(ORA_JAVA.LAST_EXCEPTION)); oder durch :control.excep := 'Exception: ' || throwable.toString(ORA_JAVA.LAST_EXCEPTION); ersetzen. Die Verwendung von Throwable anstelle von Exception hat folgende Auswirkungen: • es werden auch Fehler sichtbar, die keine Exception auslösen • es kann nur der Fehler, nicht aber der komplette Stack Trace ausgegeben werden. Seite 7 von 7