2

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 で何かをしたいことをサーバーが呼び戻す必要があるかのように。何故ですか?

4

1 に答える 1