Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 处理的会话不工作GAE+;泽西岛+;圭斯_Java_Google App Engine_Jersey_Guice_Session Scope - Fatal编程技术网

Java 处理的会话不工作GAE+;泽西岛+;圭斯

Java 处理的会话不工作GAE+;泽西岛+;圭斯,java,google-app-engine,jersey,guice,session-scope,Java,Google App Engine,Jersey,Guice,Session Scope,我有一个Java项目,使用Jersey(1.17)和Guice(3.0)。SessionScoped bean在本地开发人员中工作,但在GAE上部署时不工作。问题是它们没有保持会话状态 在web.xml中启用会话:true 我的会话bean(SessionService)是: 它被绑定到ServletModulebind(SessionService.class).in(ServletScopes.Session)中的会话范围 我使用的控制器是: @Path("/settings") pub

我有一个Java项目,使用Jersey(1.17)和Guice(3.0)。SessionScoped bean在本地开发人员中工作,但在GAE上部署时不工作。问题是它们没有保持会话状态

在web.xml中启用会话:
true

我的会话bean(SessionService)是:

它被绑定到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(); }
}
使用本地dev服务器,它可以正常工作。在GAE(1.9.5)上部署时,它会第一次设置区域设置,然后永远保持不变,即使我一次又一次地调用setLocale。为什么它不起作用


奇怪的是,我找到了一个模糊的方法使它工作,但我不知道为什么它使它工作。要使其运行,必须在设置区域设置之前触摸HttpSession。类似于
request.getSession(true).setAttribute(“whatever”,“bar”)
。好像服务器需要被调用,SessionService希望对会话执行某些操作。这是为什么?

我找到了一种方法,可以获得所需的会话处理功能。不要使用
@SessionScoped
,因为它显然不适用于GAE,而是使用
提供程序

因此,您的代码如下所示

public class SessionService {
    @Inject Provider<HttpSession> httpSessionProvider;

    public void saveSecurityInfo(Object securityInfo) {
        httpSessionProvider.get().setAttribute('sec_info', securityInfo);
    }

    public Object loadSecurityInfo() {
        return httpSessionProvider.get().getAttribute('sec_info');
    }
}
公共类会话服务{
@注入提供者httpSessionProvider;
public void saveSecurityInfo(对象securityInfo){
httpSessionProvider.get().setAttribute('sec_info',securityInfo');
}
公共对象loadSecurityInfo(){
返回httpSessionProvider.get().getAttribute('sec_info');
}
}
在控制器中,您将其插入为
@injectsessionservice SessionService


我已经在GAE上测试了这种方法,它可以工作(将信息保存在浏览器会话中)。

我遇到了完全相同的问题。我用的是GAE 1.9.10,Guice 3.0,但没有球衣。你发现了吗?因为我有解决办法,所以我没有做进一步的实验。不过,我很乐意找到正确的方法。
public class SessionService {
    @Inject Provider<HttpSession> httpSessionProvider;

    public void saveSecurityInfo(Object securityInfo) {
        httpSessionProvider.get().setAttribute('sec_info', securityInfo);
    }

    public Object loadSecurityInfo() {
        return httpSessionProvider.get().getAttribute('sec_info');
    }
}