Hi,
ich lese aus einem Maildokument verschiedene Werte aus - in einem LS-Agent.
Diese Werte will ich in Java verarbeiten. Der Aufruf meiner Java-Klasse und die Wertübergabe erfolgt mit LS2J.
Nur habe ich ein Problem beim Starten der Java-Anwendung. Wenn der Agent einen Konstruktor starten soll, kommt die Meldung "LS2J error: Java constructor failed to execute".
Die Frage ist nur, warum kommt diese Meldung?
Hier mal der LS-Agent mit dem Teil des Java-Aufrufs inkl. Parameterübergabe:
' Parameter werden weiter oben bereits ausgelesen
' ...
Dim jSession As JavaSession
Dim jClassSucheGUI As JavaClass
Dim jObjectSucheGUI As JavaObject
Set jClassSucheGUI = jSession.GetClass("SucheGUI")
' Konstruktor-Aufruf mit Parameterübergabe
Set jObjectSucheGUI = jClassSucheGUI.CreateObject("(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"
,server,serverport,user,pass,subj,sender,body)
Ist doch erstmal richtig?
Hier die Javaklasse/Konstruktor, der ausgeführt werden soll:
public class SucheGUI extends JFrame{
public SucheGUI( String server, String serverport, String user, String pass, String subj, String sender, String body ) {
//tue etwas
}
}
Mh, ich kanns mir nicht erklären, was falsch sein soll?!?! ???
Danke und Gruß
Dein Code kann nicht funktionieren, da jSession nicht initialisiert wird.
Sorry, hatte das leider nur im Post versehentlich nicht mit eingefügt... die Session wird natürlich initialisiert!
' Parameter werden weiter oben bereits ausgelesen
' ...
Dim jSession As JavaSession
Dim jClassSucheGUI As JavaClass
Dim jObjectSucheGUI As JavaObject
Set jSession = New JavaSession()
Set jClassSucheGUI = jSession.GetClass("SucheGUI")
' Konstruktor-Aufruf mit Parameterübergabe
Set jObjectSucheGUI = jClassSucheGUI.CreateObject("(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"
,server,serverport,user,pass,subj,sender,body)
Ich hab jetzt mal in den LS-Agent um den Konstruktoraufruf ein ErrorHandling gebaut, welches mir sämtliches Zeug ausgibt und alles nochmal im DebugModus ausgeführt.
' Code wie oben
...
ErrorHandling:
Set jError = jSession.getLastJavaError
Print Error
Print myError.ErrorMsg
Print myError.StackTrace
End Sub
In ErrorMsg steht "java.lang.SecurityException: Beenden mit Code 0"! AHA?!?! Sagt mir nicht viel...
Ich hab in den Eigenschaften des Agent unterm Reiter mit den Sicherheitsoptionen daraufhin alle 3 Optionen durchprobiert - leider ohne Erfolg! Die Meldung ist nach wievor die gleiche.
Ich kappiers einfach nicht :o
EDIT:
Vermutung --> Hat vielleicht Notes ein (Sicherheits-)Problem damit, wenn ein JavaProgramm ein JavaFenter darstellen will? ...das tut nämlich letztendlich mein JavaProgramm (mittels Swing).
public class SucheGUI extends JFrame{
Bitte was soll das extends JFrame?
Du startest damit eine Swing-Gui in einem eigenen Thread.
Dafür ist LS2J nicht gedacht!
Es ist eher so, dass du damit mit einem Plain Old Java Object kommunizieren kannst. Keine komplexen Konstrukte wie Swing-Guis. Ich halte es für recht wahrscheinlich, dass daher die Security Exception geworfen wird.
Du kannst auch mit LS2J keine Swing Guis starten.
Benutz die Notes Mittel (Felder) für die Eingabe und lass die mit LS2J Klasse Backend-Zeugs erledigen.
Solange du dann nicht auf die Idee kommst irgendwelche EJB Klassen oder ähnliches zu erweitern, funktioniert das auch in der Regel.
Gruß Axel
Ich habe das Problem fast lösen können!
Meine GUI wird jetzt angezeigt. Das Problem liegt an der Zeile:
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
in meiner GUI-Klasse, welche das Fenster schließt, wenn auf´s X geklickt wird.
Diese Zeile ganz auskommentiert, oder auf '.DISPOSE_ON_CLOSE' gesetzt und schon sehe ich die GUI.
Habe dazu durch Zufall ein Statement im Netz von einem User entdeckt, der das gleich Problem hatte (GUI aus Notes starten --> SecurityException):
There cannot be used method exit() in class System in Lotus Notes. It throws SecurityException.
Instead should be used method dispose(), or leave default.
Unter "fast lösen können" meine ich, dass im ActionListener meines Abbrechen-Button die Anweisung
System.exit(0)
steht, die mir auch das Fenster schließt. Gilt es vielleicht noch dies durch alternative Syntax zu umgehen?
versuch mal auf das jframe Objekt dispose() und dann setVisible(false).
Jawohl, das Fenster wird nun auch auf Buttonklick geschlossen. 8)
Danke sehr...
Eine Sache "nur" noch, die mich wundert:
Hinter meinem Ok-Button soll beim klick eine Klasse(bzw. Konstruktor) im Projekt ausgeführt werden und danach das Fenster geschlossen werden:
buttonOk.addActionListener( new ActionListener() {
public void actionPerformed( ActionEvent e ) {
JOptionPane.showMessageDialog(null, "wird angezeigt");
// Konstruktoraufruf
new NotesAddIn(post, conSet);
JOptionPane.showMessageDialog(null, "wird nicht angezeigt");
// Fenster schließen (alternativ zu exit() )
frame.dispose();
frame.setVisible(false);
//System.exit( 0 );
}
} );
Irgendwie wird aber keine Initialisierung durchgeführt - warum auch immer?!?!
Die erste JOptionPane-Ausgabe wird noch angezeigt, die zweite nicht mehr. Auch (als Test) eine JOptionPane-Ausgabe direkt als erstes in den aufzurufenden Konstruktor (in Class NotesAddIn) wird nicht angezeigt! ???
Ein Auskommentieren der Initialsierung bringt mir beide JOptionPane-Ausgaben und schließt das Fenster korrekt.
Es werden auch keinerlei Fehlermeldungen beim Debuggen ausgegeben.
Fällt hierzu jemand eine mögliche Erklärung/Ansatz ein?
EDIT: Die Java Debug-Konsole in Notes zeigt mir beim Klick auf den Button folgendes an (hab ich erst jetzt entdeckt):
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
...
...und dann noch nen ganzen Rattenschwanz mehr, u.a. mit Verweis auf die Zeile mit der Initialisierung ('new NotesAddIn(post, conSet);'). Anscheinend gibt es kein solches Objekt - häää!?!?
Ich vermute, dass ButtonOK in dieser Zeile null ist.
JOptionPane.showMessageDialog(null, "wird nicht angezeigt");
und deshalb die Nullpointer geworfen wird. Vermutlich ist ein ParentContainer in dem buttonOk steckt (ein JFrame oder so etwas) zu diesem Zeitpunkt null und buttonOk wurde auch genullt.