Wenn ich das über ein Konfigurations Dokument in dieser Form
// Set up the environment for creating the initial context
String ldapCF = _confdoc.getItemValueString("ldapCF");
String ldapURL = _confdoc.getItemValueString("ldapURL");
String ldapBaseDN =_confdoc.getItemValueString("ldapBaseDN");
String ldapUserID = _confdoc.getItemValueString("ldapUser");
String ldapPassword = _confdoc.getItemValueString("ldapPassword");
einlesen lasse krieg ich das hier raus:
26.07.2005 14:46:55 Agent error: java.lang.NullPointerException
26.07.2005 14:46:55 Agent error: at java.util.Hashtable.put(Hashtable.java:397)
26.07.2005 14:46:55 Agent error: at LDAPSearchWithFilter.NotesMain(LDAPSearchWithFilter.java:47)
26.07.2005 14:46:55 Agent error: at lotus.domino.AgentBase.runNotes(Unknown Source)
26.07.2005 14:46:55 Agent error: at lotus.domino.NotesThread.run(NotesThread.java:215)
Verdrahte ich das Ganze direkt mit dem hier
String ldapCF = "com.sun.jndi.ldap.LdapCtxFactory";
String ldapURL = "ldap://myldapsrv.mydomain.net:389/";
String ldapBaseDN ="o=MyOrg; c=de";
String ldapUserID = "cn=Administrator";
String ldapPassword = "";
dann gibt er das hier aus
26.07.2005 14:09:00 Agent error: javax.naming.CommunicationException: ldap.agsintra.net:389. Root exception is
26.07.2005 14:09:00 Agent error: java.lang.SecurityException: ldap.agsintra.net,-1
26.07.2005 14:09:00 Agent error: at lotus.notes.AgentSecurityManager.checkConnect(AgentSecurityManager.java:172)
26.07.2005 14:09:00 Agent error: at java.net.InetAddress.getAllByName0(InetAddress.java:579)
26.07.2005 14:09:00 Agent error: at java.net.InetAddress.getAllByName0(InetAddress.java:560)
26.07.2005 14:09:00 Agent error: at java.net.InetAddress.getByName(InetAddress.java:469)
26.07.2005 14:09:00 Agent error: at java.net.Socket.<init>(Socket.java:121)
26.07.2005 14:09:00 Agent error: at com.sun.jndi.ldap.Connection.<init>(Connection.java:215)
26.07.2005 14:09:00 Agent error: at com.sun.jndi.ldap.LdapClient.<init>(LdapClient.java:127)
26.07.2005 14:09:00 Agent error: at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2398)
26.07.2005 14:09:00 Agent error: at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:258)
26.07.2005 14:09:00 Agent error: at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:91)
26.07.2005 14:09:00 Agent error: at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:674)
26.07.2005 14:09:00 Agent error: at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:255)
26.07.2005 14:09:00 Agent error: at javax.naming.InitialContext.init(InitialContext.java:231)
26.07.2005 14:09:00 Agent error: at javax.naming.InitialContext.<init>(InitialContext.java:207)
26.07.2005 14:09:00 Agent error: at javax.naming.directory.InitialDirContext.<init>(InitialDirContext.java:92)
26.07.2005 14:09:00 Agent error: at LDAPSearchWithFilter.NotesMain(LDAPSearchWithFilter.java:60)
26.07.2005 14:09:00 Agent error: at lotus.domino.AgentBase.runNotes(Unknown Source)
26.07.2005 14:09:00 Agent error: at lotus.domino.NotesThread.run(NotesThread.java:215)
Ich hab das mal in eine Datenbank gepackt damit jeder meine Java UnFähigkeiten bewundern kann.
Ich glaub jetzt muss ich das dann doch mal richtig lernen. Nur wie wird sowas debugged?
OK Den Fehler hab ich auch gefunden, wenn hier String ldapCF = _confdoc.getItemValueString("ldapCF");
kein Wert drinsteht dann muss man das so:
if (ldapCF == null){
ldapCF="";
}
abfangen damit er beim Hashtable nicht aussteigt.
Ach ja und die gute alte System Konsole kann tatsächlich mit
System.out.println("ldapCF: " + ldapCF);
angesprochen werden.
Also hab ich Fehler Nummer 1 beseitigt und wende mich dem jetzt wieder auftauchenden Fehler Nummer 2 zu. :'(
Fehler nummer 2 taucht hier try {
// Create initial context
**********************************************
==> DirContext ctx = new InitialDirContext(env); <==
**********************************************
String[] attrIDs = {searchAttr};
SearchControls ctls = new SearchControls();
ctls.setReturningAttributes(attrIDs);
// Specify the search filter
String filter = "(|(cn="+searchCN+")(uid="+searchCN+"))";
// Search for objects using the above filter
NamingEnumeration answer = ctx.search("", filter, ctls);
findCN(answer, doc);
// Close the context when we're done
ctx.close();
} catch(NamingException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
auf.
Schaut bei mir so aus:
public static final String factory = "com.sun.jndi.ldap.LdapCtxFactory";
public static final String provider = "ldap://ldap.xxxxxxxx.at:389";
...
DirContext ctx;
umgebung = new Hashtable();
/* INITIAL_CONTEXT_FACTORY ... Constant that holds the name of the environment property for specifying the initial context factory to use. */
umgebung.put(Context.INITIAL_CONTEXT_FACTORY, factory);
/* PROVIDER_URL ... Constant that holds the name of the environment property for specifying configuration information for the service provider to use. */
umgebung.put(Context.PROVIDER_URL, provider);
// This class encapsulates factors that determine scope of search and what gets returned as a result of the search.
ctx = new InitialDirContext ( umgebung );
26.07.2005 14:09:00 Agent error: at lotus.notes.AgentSecurityManager.checkConnect(AgentSecurityManager.java:172)
Diese Zeile weisst darauf hin, dass es etwas mit der Agent-Security zu tun haben könnte.
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
Was willst du eigentlich ungefähr machen?
OK Den Fehler hab ich auch gefunden, wenn hier String ldapCF = _confdoc.getItemValueString("ldapCF");
kein Wert drinsteht dann muss man das so:
if (ldapCF == null){
ldapCF="";
}
abfangen damit er beim Hashtable nicht aussteigt.
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.
if ((ldapCF == null) throw new RuntimeException ("Der KonfigWert \"ldapCF\" ist nicht gesetzt. Ohne den geht hier sowieso gar nichts.");
Checke ausserdem bitte mal den Namen des Feldes in der Maske hinsichtlich Case-Sensitivität mit "ldapCF".
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.
gruß Axel
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:
If (doc != null) {
doc.replaceItemValue("FailureMessage", e);
doc.save(true);
}
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?