2016-03-21 43 views
0

Ben ThreadLocal içeren temel sınıf vardır:almak ThreadLocal() yöntemi çağrılır set beklenmeyen bir sonuç() verir

@Singleton 
public class BaseView extends HttpServlet { 

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

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

... 

} 

Ve EmailValidatedView uzatılır:

belirteci
@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(), $()); 
} 
} 

olduğunda geçersiz, ServiceException alıyorum ve yerel ayarlanmadı. Bu durumda sendResponse() yöntemi varsayılan yerel ayarı kullanmalıdır - İngilizce. Ancak, aynı sayfaya tarayıcıda geçersiz jetonla yenilenirse, her seferinde farklı/ilgili olmayan diller alabilirim. Neden oluyor?

+2

Neden bunun için ThreadLocal kullanıyorsunuz? –

+0

HttpServet, @Singleton ile ek açıklamalıdır, bu nedenle, yerel dizinin iş parçacığı güvenli olması ya da http://stackoverflow.com/a/10665256/5962766 – Justas

+0

ifadesinde argüman olarak geçmesi gerekir. Varsayılan yerel ayarı yerel ayarda belirlediğimde sorunumu çözer. – Justas

cevap

1

Çoğu HTTP sunucusu iş parçacığını bir havuzdan yeniden kullanır. Bir iş parçacığı güvenli yapılandırma tutmak iyi bir şeydir ve ThreadLocal yardımcı olabilir, ancak mantığınız, yerel ayarınız her isteği sıfırlamayacak şekilde yapılandırılmıştır. Bu nedenle, iş parçacığının geçmiş taleplerden eski bölgelerinin boşa çıkması şaşırtıcı değildir.

Yerel ayarlarınızın, her yeni istek için ayarlandığını ve her yeni istek için varsayılan yerel ayarın (veya ThreadLocal değerinin temizlendiği) ayarlandığından emin olmanız gerekir.