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?
Warum verwenden Sie ThreadLocal dafür? –
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
Wenn ich das Standardgebietsschema oben try-catch setze, löst es mein Problem. – Justas