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:
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ß
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:
at lotus.domino.JavaConnectLoader.findClass(Unknown Source)
...
at lotus.domino.JavaConnectLoader.loadClass(Unknown Source)
Hier findet er etwas nicht:
de.ibees.afps.connector.http.common14.DataObjectContainer.addBinary(DataObjectContainer.java:60)
DataObjectContainer, Zeile 60. Was machst du da?
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':
...
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"):
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' :
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? ???
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!!!
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ß