NullPointerException beim Setzen des Attributs?

8

Zum Beispiel habe ich einen Servlet-Code, der das Attribut auf einen HttpServletRequest setzt:

%Vor%

Wie stelle ich sicher, dass der obige Code threadsicher ist?

Dies ist der Stack-Trace, den ich bekomme:

%Vor%     
xybrek 20.12.2012, 11:22
quelle

5 Antworten

10
%Vor%

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.

Siehe auch:

BalusC 20.12.2012, 11:57
quelle
2

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.

    
Igorry 20.12.2012 11:35
quelle
1

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.

    
cowls 20.12.2012 11:36
quelle
1

ohne diesen Operator verwenden

%Vor%     
Manish Nagar 21.12.2012 09:32
quelle
0

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

    
Rais Alam 21.12.2012 06:20
quelle

Tags und Links