Jersey (1.17) と Guice (3.0) を使用する Java プロジェクトがあります。SessionScoped Bean はローカル dev では機能しますが、GAE にデプロイすると機能しません。問題は、セッション状態を保持しないことです。
セッションは web.xml で有効になります。<sessions-enabled>true</sessions-enabled>
私のセッション Bean (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 の Session スコープにバインドされています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 で何かをしたいことをサーバーが呼び戻す必要があるかのように。何故ですか?