Autor Thema: LS2J: Java-Konstruktor aufrufen  (Gelesen 10435 mal)

Offline magic_halli

  • Senior Mitglied
  • ****
  • Beiträge: 348
  • Geschlecht: Männlich
LS2J: Java-Konstruktor aufrufen
« am: 03.12.08 - 13:11:14 »
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:
Code
' 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:
Code
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ß
Lotus Notes 8.0.2

Offline Ralf_M_Petter

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.879
  • Geschlecht: Männlich
  • Jeder ist seines eigenen Glückes Schmied
    • Ralf's Blog
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #1 am: 03.12.08 - 15:42:36 »
Dein Code kann nicht funktionieren, da jSession nicht initialisiert wird.

Probier es mal mit

set jSession=new JavaSession()

Grüße

Ralf
Jede Menge Tipps und Tricks zu IT Themen findet Ihr auf meinem Blog  Everything about IT  Eine wahre Schatzkiste sind aber sicher die Beiträge zu meinem Lieblingsthema Tipps und Tricks zu IBM Notes/Domino Schaut doch einfach mal rein.

Offline magic_halli

  • Senior Mitglied
  • ****
  • Beiträge: 348
  • Geschlecht: Männlich
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #2 am: 03.12.08 - 15:51:43 »
Zitat
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!
Code

' 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)	
Lotus Notes 8.0.2

Offline magic_halli

  • Senior Mitglied
  • ****
  • Beiträge: 348
  • Geschlecht: Männlich
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #3 am: 03.12.08 - 16:15:12 »
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
' 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).
« Letzte Änderung: 03.12.08 - 16:26:02 von magic_halli »
Lotus Notes 8.0.2

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #4 am: 04.12.08 - 01:35:23 »
Code
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 stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline magic_halli

  • Senior Mitglied
  • ****
  • Beiträge: 348
  • Geschlecht: Männlich
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #5 am: 04.12.08 - 08:36:35 »
Zitat
Du kannst auch mit LS2J keine Swing Guis starten.
Waaas, sicher??? Das is doch Mist!   :o
...Nur keine Swing-Gui´s oder generell keine Java-Gui´s (bspw. AWT/SWT), seien sie noch so primitiv, liesen sich starten?

Zitat
Benutz die Notes Mittel (Felder) für die Eingabe und lass die mit LS2J Klasse Backend-Zeugs erledigen.
Die Java-Gui ist nicht für Eingaben gedacht, sondern stellt mir Daten dar, die aufgrund von Dokument-Values (bspw. Mailadresse, Profildok.-Values etc.) in einem ERP-System ermittelt werden. Die Valueübergabe erfolgt aus Notes mittels LS2J an Java. Nach Darstellung all dieser Daten in der GUI, ist in eben dieser noch eine letzte Bearbeitungsmöglichkeit vorhanden, bis letztendlich per GUI-Button ('OK') alle Daten als neue Datensätze ins ERP-System geschrieben werden.
Die Ermittlung und letztendliche Speicherung der ERP-Daten erfolgt eben in diesem Pakage, wo auch die GUI drin ist.
Ich wüßte jetzt nicht, wie man das anders lösen könnte (mittels Notes-Mitteln), als so...?!

Grobes Beispiel für den Ablauf:
Es soll bspw. eine Notes-Mail ins ERP-System übertragen werden.
Vorher werden anhand der Mailadresse (From) aus dem ERP bereits vorhandene sog. Ansprech- und Geschäftspartner ermittelt (in Java). Es kann mehrere Ansprechpartner zu einer Mailadresse geben, bzw. mehrere Geschäftspartner zu einem Ansprechpartner.
Die Darstellung aller ermittelten Ansprech- und Geschäftspartner erfolgt in der Java-GUI und der User kann hier nochmal händisch eine Zuordnung treffen, wenn die von Java vorgeschlagene Zuordnung nicht korrekt sein sollte.
OK-Button startet die Routine zur endgültigen Speicherung einer Notes-Mail ins ERP-System.

Soviel dazu... Wie schon gesagt, ich wüßte jetzt nicht, wie das ohne eine Java-GUI lösbar wäre.

Ist die Aussage, dass keine Swing-GUI´s ausführbar sind, definitiv und fundiert?

Gruß
« Letzte Änderung: 04.12.08 - 08:44:27 von magic_halli »
Lotus Notes 8.0.2

Offline jBubbleBoy

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.290
  • Geschlecht: Männlich
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #6 am: 04.12.08 - 08:45:36 »
Teste es doch mal indem Du "extends JFrame" raus nimmst und in eine Methode verlagerst, dann wirst Du es wissen.
Gruss Erik :: Freelancer :: KI-Dev, Notes, Java, Web, VBA und DomNav 2.5 / NSE 0.16 / OLI 2.0

--
Nur ein toter Bug, ist ein guter Bug!

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #7 am: 04.12.08 - 10:24:18 »
Waaas, sicher??? Das is doch Mist!   :o
...Nur keine Swing-Gui´s oder generell keine Java-Gui´s (bspw. AWT/SWT), seien sie noch so primitiv, liesen sich starten?
genau so ist es.

Die Java-Gui ist nicht für Eingaben gedacht, sondern stellt mir Daten dar, die aufgrund von Dokument-Values (bspw. Mailadresse, Profildok.-Values etc.) in einem ERP-System ermittelt werden. Die Valueübergabe erfolgt aus Notes mittels LS2J an Java. Nach Darstellung all dieser Daten in der GUI, ist in eben dieser noch eine letzte Bearbeitungsmöglichkeit vorhanden, bis letztendlich per GUI-Button ('OK') alle Daten als neue Datensätze ins ERP-System geschrieben werden.
Ich halte das für ausgeschlossen, aber du kannst es mit einem Applet versuchen.
In Notes 8 könntest du ein Eclipse plug-in schreiben.
Auch in Agenten kannst du GUIs starten. Das ist aber ein ziemlicher Hack.
Die Ermittlung und letztendliche Speicherung der ERP-Daten erfolgt eben in diesem Pakage, wo auch die GUI drin ist.
Ich wüßte jetzt nicht, wie man das anders lösen könnte (mittels Notes-Mitteln), als so...?!

Ist die Aussage, dass keine Swing-GUI´s ausführbar sind, definitiv und fundiert?
Nichts was ich schreibe ist definitiv. Die Fundiertheit ist nicht absolut sondern relativ.
« Letzte Änderung: 04.12.08 - 10:26:08 von Pitiyankee »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline magic_halli

  • Senior Mitglied
  • ****
  • Beiträge: 348
  • Geschlecht: Männlich
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #8 am: 04.12.08 - 10:32:54 »
Ich habe das Problem fast lösen können!
Meine GUI wird jetzt angezeigt. Das Problem liegt an der Zeile:
Code
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):
Zitat
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
Zitat
System.exit(0)
steht, die mir auch das Fenster schließt. Gilt es vielleicht noch dies durch alternative Syntax zu umgehen?
Lotus Notes 8.0.2

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #9 am: 04.12.08 - 12:08:29 »
versuch mal auf das jframe Objekt dispose() und dann setVisible(false).
Ich würd aber trotzdem eher ein Applet verwenden. Du kannst Probleme mit Memory Leaks, etc bekommen.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline magic_halli

  • Senior Mitglied
  • ****
  • Beiträge: 348
  • Geschlecht: Männlich
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #10 am: 04.12.08 - 12:35:52 »
Zitat
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:
Code

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):
Code
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äää!?!?
« Letzte Änderung: 04.12.08 - 13:02:49 von magic_halli »
Lotus Notes 8.0.2

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: LS2J: Java-Konstruktor aufrufen
« Antwort #11 am: 04.12.08 - 13:28:53 »
Ich vermute, dass ButtonOK in dieser Zeile null ist.
Code
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.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz