Domino 9 und frühere Versionen > ND6: Entwicklung

LDAP Search aus Notes DB heraus

<< < (3/4) > >>

Thomas Schulte:
Hi Axel


--- Zitat von: kennwort am 26.07.05 - 19:20:50 ---Diese Zeile weisst darauf hin, dass es etwas mit der Agent-Security zu tun haben könnte.

--- Ende Zitat ---
Hmm damit kann ich was anfangen, hoffe ich.


--- Zitat von: kennwort am 26.07.05 - 19:20:50 ---Ansonsten empfehle ich *dringend* bei ernsthafteren Java Programmen inklusive Notes-Agenten Eclipse zu benutzen. Wenn du eine Scheibe von einen Brot haben willst, machst du das ja hoffentlich auch mit einem Messer und rupfst dir da nicht mit den Fingern ein Stück raus. ;D

--- Ende Zitat ---
Naja, wenn ich aktuell kein Messer habe nehme ich die eingebauten Mehrzweckwerkzeuge. Aber im Prinzip hast du recht.


--- Zitat von: kennwort am 26.07.05 - 19:20:50 ---Was willst du eigentlich ungefähr machen?

--- Ende Zitat ---
Diesen LdapSearch zum Laufen bringen, erstmal. Und dann unter Umständen wenn das überhaupt funktioniert auch andere Daten aus diesem Metadirectory holen.


--- Zitat von: kennwort am 26.07.05 - 19:20:50 ---Hälst du das wirklich für eine gute Idee?
Ist dieser Wert nicht vielleicht eher notwendig, damit du eine Verbindung mit dem LDAP Server herstellen willst?
Dann vielleicht eher so, weil du durch das "" setzen nichts gewinnst.

--- Code: ---if ((ldapCF == null) throw new RuntimeException ("Der KonfigWert \"ldapCF\" ist nicht gesetzt. Ohne den geht hier sowieso gar nichts.");

--- Ende Code ---

--- Ende Zitat ---
zu Frage 1, nein halte ich nicht. Es ist mir nur auf die Schnelle und mit meinem vorhandenen Halbwissen nix besseres eingefallen
zu Frage 2, ja ist er. Zumindest soweit ich die Doku verstanden habe. Wenn er aber leer ist, dann wird einfach ein Ätsch nix gefunden zurückgegeben. Also empfand ich das erst einmal als nicht so schlimm. Aber dein Vorschlag gefällt mir viel besser.


--- Zitat von: kennwort am 26.07.05 - 19:20:50 ---Checke ausserdem bitte mal den Namen des Feldes in der Maske hinsichtlich Case-Sensitivität mit "ldapCF".

--- Ende Zitat ---
Ja das ist Case-sensitive. Das war das erste was ich schmerzhaft wieder lernen musste.


--- Zitat von: kennwort am 26.07.05 - 19:20:50 ---Ich hab auch länger nix mehr mit Notes und Java gemacht. Ich würd aber heute auch statt System.out.println immer log4j oder jdk14-logging verwenden. Kann vielleicht mal einen kurzen Artikel schreiben, wie man das einrichtet. Es geht hier wirklich um Arbeitserleichterung. Eclipse - Benutzung fällt unter das gleiche Thema.

--- Ende Zitat ---
Alles was hilft ist willkommen.

Thomas Schulte:
Also der Tip mit der Agent Security war schon mal Gold wert, Das hat Fehler Nummer 2 behoben.
Gruppen krieg ich jetzt schon mal zurück. Bei Personen muss ich mir den Zirkus noch genauer anschauen.

So jetzt noch eine Frage. Wie bringe ich dem Java Agent bei, das er in die Notes Maske bei Abbrüchen oder Fehlern die entsprechende Fehlermeldung direkt mitteilt?
Das müsse doch irgendwie in der Catch Anweisung zu realisieren sein, oder?

So in der Art:

--- Code: ---If (doc != null) {
doc.replaceItemValue("FailureMessage", e);
    doc.save(true);
}

--- Ende Code ---
Und wie ist das mit mehreren Catch Anweisungen, sind die so in der Art wenn einer fällt dann fallen alle oder bricht Java da sofort ab?

animate:
http://www.galileocomputing.de/openbook/javainsel4/javainsel_07_000.htm

Thomas Schulte:
Thomas willst du einen  :-* oder lieber ein Y

flaite:
Zur Unterstützung s. http://java.sun.com/j2se/1.4.2/docs/api/index.html

1. Grundsätzlich:
Meldungen im NotesDokument richten sich an den User, da der User das NotesDokument sieht.
Exception Stack Traces sind aber nicht für den User bestimmt. Sie sind mehr ein effizientes Kommunikationsmittel, damit der technische Experte für die Anwendung (dh. der Entwickler) die Ursache des Fehlers herausfinden kann.
In das Dokument würde ich eine für den User verständliche Meldung schreiben.
Den Inhalt des Stacktraces in ein LogFile.
Z.B. könntest du so arbeiten:
e.setMessage("Das Feld xxxx enthält keinen Wert");
und dann: 
doc.replaceItemValue("FailureMessage", e.getMessage());
 
2. Wie kommst du jetzt an die StackTrace Information?
Die Methode Document.replaceItemValue(String itemName, Object itemValue) konvertiert bestimmte Typen von Objekt direkt in ein entsprechendes Notes-Feldformat. Z.B. Document.replaceItemValue("eineZahl", new Integer(4)); erzeugt ein Notes Zahlenfeld.
Ich vermute stark (habs nicht ausprobiert), dass wenn man der Methode ein Object itemValue von einem Typ übergibt, mit dem es nicht direkt etwas anfangen kann (s. Notes Hilfe), die Methode versucht daraus einen String zu machen.
Jedes Objekt in Java besitzt eine String Repräsentation. Einfach weil alle Klassen von java.lang.Object erben und  java.lang.Object besitzt eine Methode toString(). Da diese Methode in der Basisklasse von allen Objekten vorhanden ist, kann sie für jedes Objekt egal welchen Typs aufgerufen werden.
Nun übergibst du ihr ein Objekt e vom Typ Exception (oder ein child von Exception). Exception wiederum erbt von java.lang.Throwable.
java.lang.Throwable besitzt eine Methode toString(), welche die Methode toString() von java.lang.Object überschreibt.
Nur leider wird man damit wenig anfangen können.

Aus 1.4.1 java-api:

--- Zitat ---Throwable.
toString
public String toString()Returns a short description of this throwable. If this Throwable object was created with a non-null detail message string, then the result is the concatenation of three strings:
The name of the actual class of this object
": " (a colon and a space)
The result of the getMessage() method for this object
If this Throwable object was created with a null detail message string, then the name of the actual class of this object is returned.

Overrides:
toString in class Object
Returns:
a string representation of this throwable.

--- Ende Zitat ---

Was du in die Konsole geschrieben hast, ist auch etwas anderes:
Nicht System.out.println(e); sondern e.printStackTrace();
Logging Frameworks wie log4j unterstützen mit speziellen Methoden die automatische Ausgabe von StackTraces. Z.B. muß man log4j einfach logger.error(e) oder so aufrufen.

Kann man auch von Hand über die Methode
StackTraceElement[] Throwable.getStackTrace(). Wie du siehst ist StackTraceElement ein Array (diese Klammern[]). StackTraceElement enthält wiederum eine toString() Methode, die das zurückgibt, was unter e.printStackTrace() ausgegeben wird.

Du könnstest mal das folgende ausprobieren:
doc.replaceItemValue("FailureMessage", e.getStackTrace());

FailureMessage sollte dafür aber ein Mehrfachwertefeld sein.

Gruß Axel

Navigation

[0] Themen-Index

[#] Nächste Seite

[*] Vorherige Sete

Zur normalen Ansicht wechseln