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?
Neden bunun için ThreadLocal kullanıyorsunuz? –
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
ifadesinde argüman olarak geçmesi gerekir. Varsayılan yerel ayarı yerel ayarda belirlediğimde sorunumu çözer. – Justas