Home > Notes & XPages > XPages: Notes Objekte in Java Singleton Patterns

XPages: Notes Objekte in Java Singleton Patterns

Ich hatte ja vor einer Weile in diesem Post am Ende von einem Problem berichtet, welches ich im XPages Forum gepostet habe.

Gestern habe ich mit Philippe Riand, dem Chef-Entwickler der XPages von IBM, über das Problem gesprochen. Hier ist die Erklärung:

Ich habe ja das NoteDatabase Objekt in der Klasseninstanz als Attribut gespeichert. D.h. dass bei jedem Request das gleiche Objekt verwendet wird, wie es ja auch bei einem Singleton Pattern sein soll.
Aber: Nach jedem Request wird ein NotesDatabase Objekt recycled, und zwar schon seit 8.5.1. Das hat einfach den Hintergrund, dass in dem NotesDatabase Objekt die Credentials des Users, der den Request abgeschickt hat, mitgespeichert werden. So würde, wenn User A die Funktion aufruft und die Klasse initialisiert, und dann User B die gleiche Funktion aufruft, die gleiche Instanz verwenden, in dem das NotesDatabase von User gespeichert ist. Würde somit die Funktion mit den Berechtigungen von User A aufrufen. Das darf natürlich nicht passieren. Daher wird, schon seit 8.5.1, ein NotesDatabase Objekt nach jedem Request recycled. Da das ganze in dem Singleton Pattern abläuft ist natürlich das Objekt noch da und nicht Null, hat aber keine Referenz mehr zur eigentlichen Datenbank und wirft somit den Fehler dass das Objekt removed oder recycled wurde.

Macht von dem Gesichtspunkt her natürlich auf jeden Fall Sinn, man muss es halt nur wissen.

Natürlich ist die Frage warum es dann bei mir unter 8.5.1 funktioniert hat. Die einzige Erklärung die wir finden konnten war, dass dies ein Bug unter 8.5.1 sein muss. Das sollte man denke ich auf jeden Fall mal bei sich in den Anwendungen überprüfen, da dies theoretisch ein ziemliches Sicherheitsrisiko sein kann.

Stattdessen sollte man, z.B. beim Aufruf der getInstance Methode die aktuelle Datenbank übergeben oder sich in der Java Klasse das Objekt direkt holen und jedes Mal neu setzen.

About these ads
  1. bloghasselbach
    29/03/2012 at 10:44 am

    Hi Matthias!

    Ich habe Dein Problem leider erst jetzt verstanden, und kann Dir versichern, daß das unter 8.5.1 auch nicht funktioniert hat. Denn das von Dir geschilderte liegt daran, das Du die Logging-Klasse in einer DataContext-Variable verwendest, und das geht schief, denn ein Notes-Objekt ist nicht serialisierbar.

    Sven

    • 29/03/2012 at 1:01 pm

      Hi,

      das mit dem Datacontext war nur eine Variante die ich ausprobiert hatte. Ich hatte das auch ohne den Datacontext ausprobiert und hatte an der Stelle wo ich die Funktion aufgerufen hatte die Klasse erst initialisiert, mit dem gleichen Ergebnis, oder hattest du etwas anderes gemeint?

      • Sven Hasselbach
        29/03/2012 at 1:45 pm

        Ich meine erstmal folgendes: Das Logging läuft auch unter 8.5.2 problemlos, unter 8.5.3 hab es noch nicht getestet.
        So scheint das Problem irgenwo anders her zu stammen, da kam mir der Ansatz mit dem Datacontext…

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.

%d bloggers like this: