2016-03-21 1 views
0

Ich habe Klasse Base, den Thread enthält:Thread get() gibt unerwartetes Ergebnis, wenn gesetzt() -Methode nicht aufgerufen wird

@Singleton 
public class BaseView extends HttpServlet { 

protected ThreadLocal<Locale> locale = new ThreadLocal<Locale>(); 

private Locale getLocale() { 
    return (Locale) ObjectUtils.defaultIfNull(locale.get(), Locale.ENGLISH); 
} 

... 

} 

Und es in EmailValidatedView erweitert:

@Singleton 
public class EmailValidatedView extends BaseView { 

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
    String token = req.getParameter("token"); 
    if (token != null) { 
     try { 
      User user = userService.validateEmail(token); 
      locale.set(user.parseLocale()); 
     } catch (ServiceException e) { 
      e.printStackTrace(); 
     } 
    } 
    sendResponse("validatedEmail.vm", resp.getWriter(), $()); 
} 
} 

Wenn Token ungültig, ich bekomme ServiceException und Gebietsschema ist nicht festgelegt. In diesem Fall sollte die Methode sendResponse() das Standardgebietsschema Englisch verwenden. Wenn ich jedoch die Aktualisierung für die gleiche Seite im Browser mit einem ungültigen Token mache, kann ich jedes Mal verschiedene/nicht verwandte Sprachen erhalten. Warum passiert das?

+2

Warum verwenden Sie ThreadLocal dafür? –

+0

HttpServet ist mit @Singleton annotiert, daher sollte das Gebietsschema threadsicher sein oder als Argument in der Methode übergeben werden. Http://StackOverflow.com/a/10665256/5962766 – Justas

+0

Wenn ich das Standardgebietsschema oben try-catch setze, löst es mein Problem. – Justas

Antwort

1

Die meisten HTTP-Server verwenden Threads aus einem Pool. Es ist eine gute Sache, eine Thread-sichere Konfiguration beizubehalten, und ThreadLocal kann helfen, aber Ihre Logik ist so strukturiert, dass Ihre Ländereinstellung nicht bei jeder Anforderung zurückgesetzt wird. Daher ist es nicht verwunderlich, dass die alten Locales des Threads aus vergangenen Requests durchgehen.

Sie müssen sicherstellen, dass Ihr Gebietsschema für jede einzelne Anforderung festgelegt ist, die es liest, und dass das Standardgebietsschema für jede neue Anforderung festgelegt ist (oder äquivalent, dass der ThreadLocal-Wert deaktiviert ist).

Verwandte Themen