Das Notes Forum

Lotus Notes / Domino Sonstiges => Java und .NET mit Notes/Domino => Thema gestartet von: magic_halli am 10.12.08 - 10:07:42

Titel: Java-Fehlermeldung bei Programmausführung
Beitrag von: magic_halli am 10.12.08 - 10:07:42
Hi,

ich habe einen LS-Agent, der mittels LS2J eine Java-Bibliothek aufruft/startet und Parameter übergibt. Im Prinzip passiert folgendes:
Der LS-Agent ermittelt aus einem Maildokument diverse Werte und übergibt diese an Java.
Das Java-Programm erstellt dann anhand dieser Daten in unserem ERP eine 1:1 Mail in unserem Posteingang.

Doch kurz vor Ende der Abarbeitung bricht Java ab und in der Java-Konsole von Notes steht folgende Meldung:
Code
java.lang.NullPointerException
	at lotus.domino.JavaConnectLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:629)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:595)
	at lotus.domino.JavaConnectLoader.loadClass(Unknown Source)
	at de.ibees.afps.connector.http.common14.DataObjectContainer.addBinary(DataObjectContainer.java:60)
	at de.ibees.notes.addin.NotesAddIn.createPosteingang(NotesAddIn.java:198)
	at de.ibees.notes.addin.SucheGUI.buttonOk_actionPerformed(SucheGUI.java:394)
	at de.ibees.notes.addin.SucheGUI$4.actionPerformed(SucheGUI.java:277)
	at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1879)
	at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2199)
	at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:450)
	at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:288)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:264)
	at java.awt.Component.processMouseEvent(Component.java:5529)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3148)
	at java.awt.Component.processEvent(Component.java:5294)
	at java.awt.Container.processEvent(Container.java:2001)
	at java.awt.Component.dispatchEventImpl(Component.java:3996)
	at java.awt.Container.dispatchEventImpl(Container.java:2059)
	at java.awt.Component.dispatchEvent(Component.java:3844)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4249)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3929)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3859)
	at java.awt.Container.dispatchEventImpl(Container.java:2045)
	at java.awt.Window.dispatchEventImpl(Window.java:1810)
	at java.awt.Component.dispatchEvent(Component.java:3844)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:545)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:268)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:197)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:191)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:183)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:144)
Jetzt weiß ich nicht so recht, wo ich ansetzen soll! Irgendwas haut anscheinend etwas mit einem ClassLoader nicht ganz hin (Notes-seitig; erste 4 Zeilen)?
Das Java-Projekt ist in Eclipse geschrieben und dann die einzelnen Class-Files in eine Domino Java-Bibliothek importiert. Unter Eclipse läuft alles ohne Probleme durch.

Habt ihr ne Idee, wo ich wie ansetzen könnte, um den Fehler einzukreisen/beheben?
Braucht ihr noch weitere Infos?

Danke und Gruß
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: m3 am 10.12.08 - 10:17:51
Wurde beim Erstellen im Eclipse auf die JRE von Domino/Notes Rücksicht genommen?
Das ist eh kein Hintergrund-Agent, oder?
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: magic_halli am 10.12.08 - 10:24:26
Wurde beim Erstellen im Eclipse auf die JRE von Domino/Notes Rücksicht genommen?
Das ist eh kein Hintergrund-Agent, oder?
Ich habe in Eclipse den Compiler auf 1.4 gestellt.

Der Agent und das Java-Programm werden nur auf Buttonklick gestartet.
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: MadMetzger am 10.12.08 - 11:39:37
Nur die Compiler-Compliance oder nutzt du ein höheres JRE und regelst die Compliance-Stufe herunter?
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: magic_halli am 10.12.08 - 11:50:21
Nur die Compiler-Compliance oder nutzt du ein höheres JRE und regelst die Compliance-Stufe herunter?
Ich nutze JRE1.6 und regel es nur herunter...
Mein Java-Programm steigt aber nur mit der Exception aus, wenn ich einen Anhang mit speichere (warum auch immer). Wenn ich eine Mail ohne Anhang übertrage, dann läuft es ohne Probleme durch - trotz JRE1.6 und "nur" runterregeln! Ich versteh´s nicht...  ???

Idee/Vorgehen:
Ich installier mir jetzt mal SDK1.4.2, weiße das meinem Eclipse-Projekt zu, importiere nochmal alles in Domino und hoffe, dass es dann geht!
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: MadMetzger am 10.12.08 - 11:57:48
Nach nochmaligem Nachdenken konnte das eben gar nicht die Lösung sein, wovon ich sprach. Bei dem Gedanken, den ich im Hinterkopf hatte, hätte es bei dir Compilerfehler geben müssen.
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: m3 am 10.12.08 - 11:59:44
Naja, aber es kann in dem Fall doch trotzdem so sein, dass eine Bibliothek verwendet wird/wurde, die im Standardset von 1.4.2 nicht vorhanden ist, oder?
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: MadMetzger am 10.12.08 - 12:17:26
Da bin ich mir nicht sicher. Das kann aber sein, dass der Classpath in der Notes-Bibliothek dann nicht stimmt. Aber dazu habe ich das bisher zu selten gemacht und Libs aus Java importiert.
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: magic_halli am 10.12.08 - 12:24:39
So, also das Eclipse-Projekt direkt mit eingebundenem Java1.4.2 compiliert bringt auch nix - Fehlermeldung bleibt genau gleich! Hab erstmal alles wieder auf Urzustand zurückgefahren.

Da bin ich mir nicht sicher. Das kann aber sein, dass der Classpath in der Notes-Bibliothek dann nicht stimmt. Aber dazu habe ich das bisher zu selten gemacht und Libs aus Java importiert.
Welcher Classpath in welcher Notes-Bibliothek (in meiner?) könnte nicht stimmen?
Die Compilierung in Notes erfolgt ohne Probleme!
Oder redest Du in Bezug auf:
Code
at lotus.domino.JavaConnectLoader.findClass(Unknown Source)
...
at lotus.domino.JavaConnectLoader.loadClass(Unknown Source)
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: MadMetzger am 10.12.08 - 13:32:27
Wenn die Bibliothek auch unter Notes kompiliert, dann weiß ich leider nicht weiter. Leider kenne ich mich in genau dem Zusammenspiel LS2J zu wenig aus.
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: magic_halli am 10.12.08 - 14:36:43
Mh, kann ich meine Java-Bibliothek, die ja unter 'Gemeinsamer Code/Scriptbibliotheken' gespeichert ist irgendwie mit Eclipse Remote Debuggen? Geht sowas?

Wenn ja, wie richte ich das erstmal ein - gibts HowTo´s hierfür?
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: flaite am 10.12.08 - 14:48:52
Hier findet er etwas nicht:
Code
de.ibees.afps.connector.http.common14.DataObjectContainer.addBinary(DataObjectContainer.java:60)
DataObjectContainer, Zeile 60. Was machst du da?
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: magic_halli am 10.12.08 - 14:59:56
Hier findet er etwas nicht:
Code
de.ibees.afps.connector.http.common14.DataObjectContainer.addBinary(DataObjectContainer.java:60)
DataObjectContainer, Zeile 60. Was machst du da?
Hier wird eine Methode aufgerufen, die ein byte[] in xml umwandelt. Diese Klasse/Methode ist in meinem eingebundenen Jar-File drin, welches ich in dem ganzen Projekt nutze.
Anscheinend wird dort die NullPointerException geworfen, weil die Methode nicht erreichbar scheint?!
...ist aber völlig unerklärlich, da ich in meinem Code direkt über der Zeile, welche diese 'addBinary'-Methode aufruft, eine 'addString'-Methode der gleichen Klasse aufrufe!

Deshalb bin ich jetzt grad dran Remote Debugging einzurichten, damit ich meine Java-Bibliothek mit dem Eclipse-Debugger analysieren kann...
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: flaite am 10.12.08 - 17:46:37
Kannst du nicht einfach die Zeile hier hinposten. Oder ist die zu geheim ?  ;D
Ich vermute, dass du dort aus irgendwelchen Gründen null übergibst und das da nicht geht.
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: magic_halli am 11.12.08 - 08:05:08
Kannst du nicht einfach die Zeile hier hinposten. Oder ist die zu geheim ?  ;D
Ich vermute, dass du dort aus irgendwelchen Gründen null übergibst und das da nicht geht.
Ok, ich poste mal Code (ist nicht geheim), aber ob da ein Zusammenhang ersichtlich wird - glaube fast nicht, da sehr komplex...?!

1. Erzeugung byte[] 'binary' und Übergabe an Methode 'addBinary' aus Klasse 'DataObjectContainer':
Code
...
String filename = filepath.substring(filepath.lastIndexOf("\\")+1, filepath.length());
byte[] binary = getBinaryFromFile(filepath);

DataObjectContainer anlageCon = anlagenCon.createSubContainer("Anlage");
anlageCon.addString("Name", filename);
anlageCon.addString("DateiName", filename);
anlageCon.addBinary("Binary", binary);

Die Exception wird geworfen, wenn 'addBinary'-Methode aufgerufen werden soll. Mit 'addString' gibts keinerlei Probleme! (seeeehr komisch)

2. Die Methoden 'addString' und 'addBinary' aus der Klasse 'DataObjectContainer' (plus deren "Helper-Methoden"):
Code
private TreeMap _dataObjectMap;

  public void addString(String name, String value) {
    add(name.toLowerCase(), new StringWrapper(value));
  }

  public void addBinary(String name, byte[] value) {
    add(name.toLowerCase(), new BinaryWrapper(value));
  }

...
  private void add(String name, ValueWrapper value) {
    _dataObjectMap.put(name.toLowerCase(), value);
  }

3. Die Klasse 'BinaryWrapper' :
Code
public class BinaryWrapper extends ObjectWrapper implements ValueWrapper {
  public final static String DATATYPE = "binary";

  public BinaryWrapper(byte[] value) {
    super(value);
  }
...
}

Punkte 2. und 3. stammen aus einem JAR, welches bereits seit ewigen Zeiten entwickelt und genutzt wird... hier kann der Fehler nicht liegen!!! Probleme gibts erst im Zusammenspiel aus/mit Notes.
Die Frage ist eben nur, wieso klappt bei 1. zuerst 'addString' und 'addBinary' wirft NullPointerException?!?! Mein byte[] 'value' hat definitiv eine Größe (zu Testzwecken vorher ausgegeben - stimmt auch).

So, wenn das jetzt helfen sollte, wäre ich echt überwältigt...

Danke und Gruß


EDIT: ...deshalb meine Frage noch hinterher: Kann man eine Java-Bibliothek (kein Java-Agent), die im Designer gespeichert ist, mit Eclipse remote debuggen?  ???
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: MadMetzger am 11.12.08 - 10:09:10
Code
DataObjectContainer anlageCon = anlagenCon.createSubContainer("Anlage");

Also das Problem könnte dann aus der Methode createSubContainer("Anlage") kommen. Denn von hieraus beziehst du deinen neuen DataObjectContainer, der an dieser Stelle offensichtlich null ist. Dazu müsstest du mal in diese Methode schauen, ob die unter Umständen auch mal null zurückgeben kann.
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: flaite am 11.12.08 - 11:14:17
EDIT: ...deshalb meine Frage noch hinterher: Kann man eine Java-Bibliothek (kein Java-Agent), die im Designer gespeichert ist, mit Eclipse remote debuggen?  ???
Hast du das mal versucht wie hier beschrieben (mit Eclipse statt mit Rational Architect)?
http://www.tlcc.com/admin/tips.nsf/tipurlref/20041213

Eigentlich müsste das gehen.
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: magic_halli am 12.12.08 - 10:30:54
So, nach vielen Fragezeichen und Konfusionen konnte ich mein ClassLoader-Problem lösen. Allerdings wirft die Lösung dennoch Fragen auf!
Ich muss die Klasse 'BinaryWrapper', welche durch die 'addBinary'-Methode eigentlich instanziert wird (siehe Quellcode-Ausschnitte), noch vor meiner eigentlichen Programmausführung (Einstieg ist hierbei eine Gui-Initialisierung) separat instanzieren!!!
Code
public class SucheGUI extends JFrame {

 public SucheGUI(...) {
   // neu: Klasse BinaryWrapper instanzieren
   initWrapper();

  // hier dann meine ursprüngliche Programmabarbeitung
  initGUI();
  ...
 }

...

 private void initWrapper() {
    try {
      new BinaryWrapper(new byte[0]);
    }
    catch (Exception err) {
      err.printStackTrace();
    }
  }

}

Nur so konnte ich die NullPointerException eliminieren! Seeeehr komisch und verstehen tu ich das nicht wirklich...
Anscheinend gibt es ein Problem mit Notes, dass dieses sonst irgendwie diese Klasse nicht laden konnte?!?!
Bleibt natürlich noch zu klären, warum das so ist, denn eine befriedigende Lösung ist das auf Dauer nicht wirklich. Gibts da vielleicht irgendwelche Sicherheitsrichtlinien od. -Einschränkungen auf Notes-Seite?! Zumal bei der Ausführung in Eclipse eine solche Instanzierung nicht nötig ist - wäre mir auch unlogisch.

Gruß
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: flaite am 12.12.08 - 10:51:03
Schwierig bis unmöglich das per Ferndiagnose zu lösen. Glaub nicht, dass das etwas mit Sicherheitszeugs zu tun. Vielleicht wird das vorher intern so initialisiert, dass dem Constructor statt dem byte-Array null übergeben wird.
Hauptsache es funktioniert.  ;D
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: magic_halli am 12.12.08 - 11:02:56
... Glaub nicht, dass das etwas mit Sicherheitszeugs zu tun. Vielleicht wird das vorher intern so initialisiert, dass dem Constructor statt dem byte-Array null übergeben wird.
Hauptsache es funktioniert.  ;D
Klar, es funktioniert... fühle mich auch erstmal ziemlich gut!  8)

...aber es macht mich trotzdem nachdenklich in Bezug auf weitere Programmierarbeiten mit Notes-LS2J-Java, denn wenn dann in größeren Projekten solche Fehler auftreten und die Ursache nicht wirklich geklärt ist, fällt mir der ganze Mist wieder auf die Füße. Naja, ich ergebe mich erstmal meinem Schicksal.  ;)

Danke und Gruß
Titel: Re: Java-Fehlermeldung bei Programmausführung
Beitrag von: flaite am 12.12.08 - 11:58:57
Grundsätzlich sollte es keine Probleme geben, ausser bei Memory-Leaks.
Bin ziemlich sicher, dass das Verhalten wird durch irgendwelche Interna des Codes rund um BinaryWrapper() erzeugt wird.
Ich hab mal ein Framework geschrieben, in der die Notes Api implementierende Klassen Notes-Verhalten simmulieren. Vielleicht schreib ich da mal weiter. Ist aber irgendwann sehr viel Arbeit.