Lotus Notes / Domino Sonstiges > Java und .NET mit Notes/Domino
Java Agent wirft Fehler "Special database object cannot be located"
Legolas:
Hallo Forum,
ich erhalte die Fehlermeldung "Special database object cannot be located" bei folgendem Java Agent Quellcode.
Nach meinen Recherchen ist diese Funktion wohl die Einzigste innerhalb von Lotus Notes, welches mir den kompletten HTML/MIME Code eines Dokuments im Backend zurückliefern kann, um diesen als EML File abzuspeichern.
Der Code soll mir den Dokumentstream zurückgeben, damit ich diesen als EML File abspeichern kann.
Sowohl der Versuch mit "doc.getHttpURL();" als auch der manuelle Versuch danach werfen den gleichen Fehler.
Der Fehler tritt beim Befehl: InputStream streamIn = docURL.openStream(); auf.
Hier der Auszug aus dem Quellcode:
--- Code: --- //Dokument aus der Ansicht holen und transformieren
AgentContext agentContext = session.getAgentContext();
db = agentContext.getCurrentDatabase();
view = db.getView("aTest1");
doc = view.getFirstDocument();
System.err.println(" ");
System.err.println("#### Start ####");
System.err.println("doc.getUniversalID(): " + doc.getUniversalID());
String docid = doc.getUniversalID();
//notesURL = "/" + db.getFilePath() + "/" + view.getName() + "/" + docid + "?OpenDocument";
String notesURL = doc.getHttpURL();
System.err.println("notesURL: " + notesURL);
notesURL = "http://xxvvzz/__C12578D200357B40.nsf/aTest1/C2AAA058435D4BD0C125794900441DB0?OpenDocument";
System.err.println("notesURL: " + notesURL);
URL docURL =new URL(notesURL);
System.err.println("100");
InputStream streamIn = docURL.openStream();
System.err.println("110");
--- Ende Code ---
In der Anwendung gibt es eine Ansicht die mit dem * für die Defaultview gekennzeichnet ist.
Dies war meine erste Vermutung!
Sowohl das Dokument als auch die Ansicht "aTest1" (zweiter Versuch) sind definitiv vorhanden.
Was kann noch den Fehler werfen?
Anbei der Screenshot von der Serverkonsole.
Systemumgebung:
- Domino 8.5.2 FP3 deutsch
- Lotus Notes 8.5.3 deutsch
Grüße
Legolas
flaite:
Zur Not kannst Du das Framework benutzen, dass ich in diesem Thread entwickelt hab:
http://atnotes.de/index.php/topic,52899.20.html
Ist zwar ein bischen dappisch, mit jakarta HTTP Client einen HTTP Get von einem Agenten gegen den HTTP Task des gleichen Servers abzusetzen, auf dem der Agent läuft. Aber wenn es schon einen ECHTEN HAMMER gibt, besteht die Welt halt nur noch aus Nägeln. ;) (was wirklich ironisch gemeint ist)
Schau dir aber vorher besser nochmal HTTPUrlConnection aus dem jdk an. Das ist in diesem Fall möglicherweise viel einfacher.
Gruß Axel
m3:
Gib mal "Anonymous" Leserechte auf die DB, starte den HTTP Task neu und probiers dann nochmal.
Was ist denn "URL docURL =new URL(notesURL);" ?? URL ist keine Notes-Klasse, oder? Was macht die, wie macht die, ...
getHttpURL() macht ja, wenn ich das Log richtig gelesen habe.
flaite:
java.net.URL ist aus der JVM.
Normalerweise macht man das eher mit HTTPUrlConnection. Versuch das mal aus.
http://www.devdaily.com/blog/post/java/how-open-url-read-contents-httpurl-connection-java , oder moment. Das ist vermutlich Verschwendung von Lebenszeit. Les erstmal das unten.
Und in jedem Fall in dem url-String Protokoll://server:port mit drinhaben, falls xxvvzz nicht der server ist.
Aber nochmal versuchen mit http://ipserver:80/
auch nicht >:(
Sehr vermutlich ist auch einfach ein Leserfeld auf dem Dokument auf welches du zugreifen willst. Die http Engine meldet ja im Log, das sie auf das Dokument zugreifen will, der GET Request ist also beim Server angekommen. Der Server gibt nur nicht das Dokument raus, weils ein Unauthentifizierter Zugriff auf die Ressource ist und die mit einem Lesefeld geschützt ist.
In dem Fall gibts gute Chancen, dass ich einen neuen nicht-zahlenden Kunden für mein Framework gewinne (s.o.)
Ich könnte Dir morgen abend auch eine basic Authentification Erweiterung schreiben. Das Teil soll ja wachsen.
Sobald du in den jre-Klassen bist (wie java.net.URL) bewegst Du dich außerhalb der Notes Security. Der Domino HTTP Task weiss nich, dass der GET Request aus einem der Agenten seines eigenen Domino Servers kommt. Definitiv.
lG
Axel
Legolas:
Hallo Pitiyankee,
zuerst mal danke für die prompte Rückmeldung.
Mit der Vermutung der Berechtigung (Leser/Autorenfleder) lagst du richtig.
Es gab Leser- und Autorenfelder im Dokument.
Ich habe zu Testzwecken nun nachfolgendes getan:
- Alle Leser / Autorenfelder im Dokument komplett raus gelöscht
- In der ACL den Anonymous auf Zugriff: „Administrator“ gesetzt
Ich erhalte aber leider immer noch diese Fehlermeldung.
Ich bin leider kein Experte im Bezug mit Java Agenten und Lotus Notes.
Vielleicht könntest du mir die unten aufgeführten Fragen kommentieren, das würde mir sicher weiterhelfen.
Hier die Fragen, die sich für mich nach Deinem Posting ergeben haben:
1) Wenn ich dich richtig verstehe, wird ein Java-Agent der auf die http Enging von Domino zugreift nicht im Namen des Dominoservers ausgeführt (wie Notes Agenten), sondern greift immer als Anonymous zu?
Oder welche Berechtigung benötigt ein solcher Agent denn?
(Normale Java Agenten auf dem Server laufen aber im Kontext des Servers. Hier habe ich schon Agenten laufen, die auf Dokumente mit Autorenfeldern zugreifen!)
2) Hat das obige Problem vielleicht irgendwas mit den Einstellungen „Öffentliches Dokument“ zu tun?
3) Benötigt die Anwendung irgendwelche Designelemente, die diese Art von Java-Agent Aufruf erwartet? (z.B.: DefaultView, usw.)
4) Gibt es eine Möglichkeit, den Java Code der auf den http Task zugreift so auszuführen, dass dieser mit einer Berechtigung auf die DB ausgeführt wird, die nicht über den Anonymous läuft? (z.B.: im Kontext des Servers läuft!) Ziel wäre, mit Dokumente zu arbeiten, die Leser und Autorenfelder besitzen.
5) Kennst du vielleicht einen einfacheren bzw. besseren Weg ein Dokument als HTML/Mime aus dem Backend zu erhalten um dies als EML-Datei abzuspeichern?
6) Wenn ich einen System.err.println() im java-code ausführe, wird dieser in der Domino Konsole immer als "Agent error ...." ausgegeben. Gibt es eine Möglichkeit diesen irreführende Hinweis zu umgehen?
Grüße und Danke für deine Mühe
Legolas
--- Code: ---//Dokument aus der Ansicht holen und transformieren
AgentContext agentContext = session.getAgentContext();
db = agentContext.getCurrentDatabase();
view = db.getView("aTest1");
doc = view.getFirstDocument();
System.err.println(" ");
System.err.println("#### Start ####");
System.err.println("doc.getUniversalID(): " + doc.getUniversalID());
String docid = doc.getUniversalID();
String notesURL = doc.getHttpURL();
System.err.println("notesURL: " + notesURL);
URL docURL =new URL(notesURL);
System.err.println("100");
InputStream streamIn = docURL.openStream();
System.err.println("110");
InputStreamReader str = new InputStreamReader(streamIn);
System.err.println("120");
--- Ende Code ---
Navigation
[0] Themen-Index
[#] Nächste Seite
Zur normalen Ansicht wechseln