hi :)
ich hab da ein problem mit der domino java-api. ich erstelle im hauptprogramm ein fenster mit einem jtree, mit dessen hilfe ich die databases, darunter die views und darunter wiederum die documents anzeigen will. dem tree übergebe ich dabei das session-objekt. er wird aber nicht gleich komplett aufgebaut, sondern es wird immer erst die nächste ebene geladen, wenn man einen teil aufklappt. dadurch wird ein event ausgelöst und eine funktion explore() im jeweiligen treenode aufgerufen. dort bekomme ich folgenden fehler:
NotesException: Object has been removed or recycled
at lotus.domino.local.NotesBase.CheckObject(Unknown Source)
at lotus.domino.local.Database.getViews(Unknown Source)
at test.DatabaseNode.explore(DatabaseNode.java:76)
at test.DominoTree.treeExpanded(DominoTree.java:47)
at javax.swing.JTree.fireTreeExpanded(Unknown Source)
at javax.swing.JTree.setExpandedState(Unknown Source)
at javax.swing.JTree.expandPath(Unknown Source)
at javax.swing.plaf.basic.BasicTreeUI.toggleExpandState(Unknown Source)
at javax.swing.plaf.basic.BasicTreeUI.handleExpandControlClick(Unknown Source)
...
das problem scheint mir, dass der notes-thread nicht mehr gültig ist und das database-objekt somit keine gültigkeit mehr hat. wie komme ich nun an dieses objekt heran, ohne wieder von vorn alles aufzurollen (session erzeugen und über diese die datenbank holen)? das problem ist ja auch, dass ich in dem fall gar nicht weiß, welche datenbank ich da geöffnet habe...
der vollständigkeit halber nochmal die explore-funktion innerhalb meiner DatabaseNode-Klasse:
public void explore()
{
if ( !isExplored() )
{
Database database = getDatabase();
try
{
// folgende zeile erzeugt den fehler
Iterator<View> views = database.getViews().iterator();
while ( views.hasNext() )
add( new ViewNode( views.next() ) );
explored = true;
}
catch ( NotesException exc )
{
exc.printStackTrace();
}
}
}
ist das problem relativ einfach zu lösen? oder wäre es vielleicht doch besser, wenn ich mir ein gutes buch zu dem thema hole und ein wenig schmökere... mit domingo hab ich auch schon ein wenig rumgespielt, aber leider bietet es nicht alle funktionen wie die original-api, auf die ich nicht unbedingt verzichten will (z.b. alle datenbanken eines directories geben lassen).
ich hoffe, mein problem wurde verständlich. ich danke schonmal im vorraus für die hoffentlich erscheinende hilfe :) bis demnächst
Hi,
das Problem muß irgendwo anders liegen. Ich vermute auch, dass bei Frage 1) eine Abfrage db.isOpen() auf das entsprechende Datenbankobjekt false zurückgibt.
Die Notes Java Api ist da an vielen Stellen nicht besonders transparent. Das Interface wurde irgendwann 1998 designed. Heute würden da viele Sachen klarer gemacht.
In dem Scope, in dem du versuchst auf das Datenbankobjekt zuzugreifen, ist es (aus irgendwelchen Gründen) nicht referenziert.
Sieht für mich fast so aus, dass du irgendwo eine lokale Variable benutzt hast, wo du glaubst eine Instanzvariable zu benutzen.
Kommt z.B. so zuStande:
private Database myDatabase;
public void setDb (Database myDatabase) {
myDatabase = myDatabase;
}
stattdessen:
public void setDb (Database myDatabase) {
this.myDatabase = myDatabase;
}
ODER UND WESENTLICH WAHRSCHEINLICHER: wenn du das gleiche DB Objekt benutzen willst, muß das Session Objekt, mit der das ursprüngliche DB Objekt geholt worden ist bei weiteren calls auch benutzt werden.
Ich bin mir ziemlich sicher, dass deine Probleme von Remote-calls und local calls die gleiche Ursache haben, auch wenn sie sich unterschiedlich manifestieren.
Ich glaub sogar, dass dein Problem eigentlich die gleichen Ursachen hat wie die "stateless-not-enough" von Gavin King gegen Spring, aber das krieg ich nicht so nebenbei erklärt.
IMNSHO scheinen die Probleme daringehend begründet zu sein, dass dir der Lebenszyklus der von dir verwendeten Objekte nicht wirklich klar ist.
Ich glaub das Buch ist gut, kenne es aber nicht. 50 Euro für ein Buch, dass sich nur mit einer Api beschäftigt, finde ich viel Geld.
Gruß Axel