我们正在运行Struts 2.5.14.1并致力于外部化Tomcat会话状态。这需要Serializable会话。但是,我们使用ExecuteAndWait拦截器的Action失败了。由于我们的原始代码非常复杂,我在下面写了一个更简单的代码,演示了完全相同的行为。
这里显示的是简单的操作:
package com.sentrylink.web.actions;
import java.util.concurrent.TimeUnit;
import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@SuppressWarnings("serial")
@Results({
@Result(name="wait", location="/"),
@Result(name=ActionSupport.SUCCESS, location="/WEB-INF/content/messagePage.jsp"),
})
@InterceptorRefs({
@InterceptorRef("webStack"),
@InterceptorRef("execAndWait")
})
public class TestExecuteAndWait extends ActionSupport {
public String execute() throws Exception {
TimeUnit.SECONDS.sleep(10);
return SUCCESS;
}
}
运行此功能
WARNING: Cannot serialize session attribute __execWaittest-execute-and-wait for session 74CDB9F8D00BBC697030AFC6978E94F6
java.io.NotSerializableException: com.opensymphony.xwork2.inject.ContainerImpl$ConstructorInjector
看起来Struts正在引入一个不需要的项目进行序列化。它可能与here描述的错误有关,虽然该错误的修复似乎出现在2.5.14.1中(毫不奇怪,因为该修复是在2013年)。
我怀疑这是框架中的一个错误,但在我继续提交报告并为自己找出解决方法之前,我想我会看到是否有人有解决方案或曾经让ExecuteAndWait与序列化工作会话。