Anzeige des Java Error Stack in Oracle Forms

Werbung
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
Herunterladen