У меня есть проект Java, в котором я использую Jersey (1.17) и Guice (3.0). Компоненты SessionScoped работают в локальной среде разработки, но не работают при развертывании в GAE. Проблема в том, что они не сохраняют состояние сеанса.
Сеансы включены в web.xml: <sessions-enabled>true</sessions-enabled>
Мой сеансовый компонент (SessionService):
@SessionScoped
public class SessionService implements Serializable {
@Inject transient Logger log;
private Locale locale = Locale.US;
public synchronized Locale getLocale() { return locale; }
public synchronized void setLocale(Locale locale) { this.locale = locale; }
}
и он привязан к области сеанса в ServletModule bind(SessionService.class).in(ServletScopes.SESSION);
Контроллер, где я его использую:
@Path("/settings")
public class SettingsController {
@Inject SessionService sessionService;
@GET
@Path("/setLocale")
public Object setLocale(@QueryParam("languageTag") String languageTag) {
sessionService.setLocale(Locale.forLanguageTag(languageTag));
return "OK";
}
@GET
@Path("/getLocale")
public Object getLocale() { return sessionService.getLocale().getLanguage(); }
}
С локальным сервером разработки все работает нормально. При развертывании в GAE (1.9.5) он устанавливает локаль в первый раз, а затем остается неизменной навсегда, хотя я снова и снова вызываю setLocale. Почему это не работает?
Как ни странно, я нашел малоизвестный способ заставить его работать, но я не знаю, почему он заставляет его работать. Чтобы он работал, необходимо коснуться HttpSession перед установкой локали. Как request.getSession(true).setAttribute("whatever", "bar")
. Как будто серверу нужно было напомнить, что SessionService хочет что-то сделать с Session. Почему это?