Dies (Wortspiel beabsichtigt) legt nahe, dass Sie request
und response
als Instanzvariablen einer Klasse zugewiesen haben. Ihr konkretes Problem legt wiederum nahe, dass die Instanz der Klasse selbst nicht sicher ist.
Angenommen, es ist das Servlet selbst, dann haben Sie die Ursache für Ihr Problem. Servlets sind überhaupt nicht threadsafe. Während des Startvorgangs der Webanwendung wurde nur eine einzige Instanz erstellt, die dann über alle -Anfragen anwendungsweit gemeinsam genutzt wird.
Sie sollten niemals Anforderungen oder sitzungsbezogene Daten als Instanzvariable des Servlets zuweisen. Es würde nur überschrieben werden, wenn eine weitere HTTP-Anfrage gleichzeitig stattfindet. Das würde deinen Code threadunsicher machen, so wie du dich selbst begegnet bist.
Hier ist ein Code, der das veranschaulicht:
%Vor% Das Zuordnen der HTTP-Anfrage selbst als Instanzvariable eines Servlets ist eigentlich ein epischer Fehler. Wenn Benutzer Y eine weitere Anforderung zur gleichen Zeit auslöst, zu der das Servlet die Anforderung von Benutzer X bearbeitet, erhält Benutzer X sofort die Objekte request
und response
von Benutzer Y zur Hand. Dies ist definitiv threadunsicher. Die NPE wird verursacht, weil die request
in diesem Moment mit der Verarbeitung für den Benutzer Y "fertig" und somit freigegeben / zerstört ist.
Die Anfrage ist threadsicher durch ihre Definition (im Gegensatz zu Session und ServletContext).
Zur Ausnahme: Welche Tomcat-Version verwenden Sie? Das sieht nach einem Tomcat Bug aus.
Implementiert die Klasse, die der Rückgabetyp von someValue()
ist, HttpAttributeBindingListener
? Und, kann someValue()
method return null
? Wenn beide Ja, dann ist die NullPointerException
offensichtlich.
Ich bin mir nicht sicher, was das damit zu tun hat, dass es threadsicher ist.
Die Ausnahme, die Sie erhalten, ist eine NullPointerException, die aussieht, als ob Tomcat versucht, eine Methode für ein Null-Objekt aufzurufen.
In einer Java-Webanwendung hat jede Anfrage ihre eigene HttpServletRequest-Instanz. Sie können also die Attribute für die Anfrage festlegen und darauf vertrauen, dass sie nur für diesen Benutzer gilt.
Wenn Sie sich die Implementierung der Anforderungsschnittstelle in tomcat ansehen, sieht es wie folgt aus:
%Vor%Es ist deutlich zu erkennen, dass, wenn der Schlüssel null ist, IllegalArgumentException ausgegeben wird, aber wenn der Wert null ist, wird einfach der Schlüssel und das alte zugehörige Objekt aus dem Reposatory entfernt. Wenn jedoch keiner von ihnen null ist, wird das Objekt mit diesem Schlüssel verknüpft und ihnen ein Repository hinzugefügt.
Es scheint ein temporäres oder tomcat Problem zu sein.
Weitere Informationen zur Implementierung finden Sie unter dem folgenden Link Quellcode der Request Implementation von tomcat