Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.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上的Struts 2:无法在侦听器内设置会话值_Java_Google App Engine_Session_Struts2_Freemarker - Fatal编程技术网

Java GAE上的Struts 2:无法在侦听器内设置会话值

Java GAE上的Struts 2:无法在侦听器内设置会话值,java,google-app-engine,session,struts2,freemarker,Java,Google App Engine,Session,Struts2,Freemarker,我正在编写一个Struts2解释器,在其中检查用户是否有效。如果无效,用户将重定向到登录页面。但在此之前,我试图检索用户访问的URL,并将其放入会话变量中,以便在登录完成时将其重定向回那里。但当我尝试在会话中放入值时,它会引发以下异常: java.lang.NoClassDefFoundError: Could not initialize class freemarker.template.Configuration at org.apache.struts2.views.freema

我正在编写一个Struts2解释器,在其中检查用户是否有效。如果无效,用户将重定向到登录页面。但在此之前,我试图检索用户访问的URL,并将其放入会话变量中,以便在登录完成时将其重定向回那里。但当我尝试在会话中放入值时,它会引发以下异常:

java.lang.NoClassDefFoundError: Could not initialize class freemarker.template.Configuration
    at org.apache.struts2.views.freemarker.FreemarkerManager.createConfiguration(FreemarkerManager.java:322)
    at org.apache.struts2.views.freemarker.FreemarkerManager.init(FreemarkerManager.java:273)
    at org.apache.struts2.views.freemarker.FreemarkerManager.getConfiguration(FreemarkerManager.java:260)
    at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:865)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:574)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:123)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:63)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter.java:368)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:351)
    at com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116)
    at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
    at org.mortbay.jetty.handler.ContextHandler.__handle(ContextHandler.java:765)
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java)
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
    at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:97)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:485)
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    at org.mortbay.jetty.Server.handle(Server.java:326)
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
    at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
    at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
注意:它说找不到类,但我可以在buildpath中的库列表中看到配置类。 拦截器中的一段代码:

public String intercept(ActionInvocation actionInvocation)
        throws Exception {
    System.out.println("inside auth interceptor");
    //just to make sure session is created the first time
    HttpSession session = ServletActionContext.getRequest().getSession(true);
    Map<String, Object> sessionAttributes = ActionContext.getContext().getSession();

    User user = (User) sessionAttributes.get("user");

    ActionProxy proxy = actionInvocation.getProxy();
    String namespace =  proxy.getNamespace();
    String actionName = proxy.getActionName();

    sessionAttributes.put("returnUrl",  namespace+(actionName == null || actionName.equals("/") ?"":("/"+actionName)));
    //even tried this, but getting same error : 
    //session.setAttribute("returnUrl",  namespace+(actionName == null || actionName.equals("/") ?"":("/"+actionName)));
    System.out.println(namespace+(actionName == null || actionName.equals("/") ?"":("/"+actionName)));

    if(user == null){
        //no user exist. redirect to Login page
        return Action.LOGIN;

    }else
        return actionInvocation.invoke();
}
公共字符串截获(ActionInvocation-ActionInvocation)
抛出异常{
System.out.println(“内部身份验证拦截器”);
//只是为了确保会话是第一次创建的
HttpSession session=ServletActionContext.getRequest().getSession(true);
Map sessionAttributes=ActionContext.getContext().getSession();
User=(User)sessionAttributes.get(“User”);
ActionProxy=actionInvocation.getProxy();
String namespace=proxy.getNamespace();
字符串actionName=proxy.getActionName();
sessionAttributes.put(“returnUrl”,名称空间+(actionName==null | | actionName.equals(“/”):(“/”+actionName));
//甚至尝试了这个,但得到了相同的错误:
//session.setAttribute(“returnUrl”,命名空间+(actionName==null | | actionName.equals(“/”):(“/”+actionName));
System.out.println(名称空间+(actionName==null | | | actionName.equals(“/”):(“/”+actionName));
if(user==null){
//不存在用户。重定向到登录页面
返回Action.LOGIN;
}否则
返回actionInvocation.invoke();
}
如您所见,我甚至尝试了
session.setAttribute
以获得相同的错误。在没有将任何内容放入会话变量的情况下,代码按预期运行。那我做错了什么


更新1:我在
web inf/lib
中有所需的
freemarker-2.3.19
,并将其添加到构建路径中

部署项目时,jar文件必须位于类路径上,该类路径应包含错误类中提到的。为了确保文件已部署,您可以将其作为临时措施放置在
web inf/lib
中。您还可以将一个文件组装到war归档中,以便整体部署。我说的图书馆档案是

freemarker-2.3.19.jar
如果您使用的是maven,那么
pom.xml

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.3.16</version>
</dependency>

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.19</version>
</dependency>

org.apache.struts
struts2型芯
2.3.16
org.freemarker
自由标记
2.3.19

这是我检查的第一件事。我的
web inf/lib
文件夹中确实有这个。