在执行特定的工作流时会出现这个问题-
H 210G 211现在问题出现了。我有一个拦截器,它能正确捕获会话到期。它还正确地标识了最初的请求是AJAX。因此,这意味着拦截器需要使用json响应(对任何ajax调用都接受输入格式)。
拦截器代码-
public class AuthenticationInterceptor implements Interceptor {
private InputStream jsonStream;
@Override
public String intercept(ActionInvocation actionInvocation) throws Exception {
... // boilerplate init code.
if (memberId == null
&& StringUtils.equals("XMLHttpRequest", request.getHeader("X-Requested-With"))) {
Map<String, Object> responseObject = Maps.newHashMap();
Set<String> errors = Sets.newHashSet();
errors.add("Your session has expired. Please refresh page and login.");
responseObject.put("errors", errors);
responseObject.put("success", false);
jsonStream = ResponseUtils.getJSONResponseStream(responseObject);
return "json";
}
}
public InputStream getJsonStream() {
return jsonStream;
}
public void setJsonStream(InputStream jsonStream) {
this.jsonStream = jsonStream;
}struts.xml代码-
<package name="raisin" namespace="/raisin" extends="secure">
<interceptors>
<interceptor name="authentication" class="interceptors.AuthenticationInterceptor"/>
</interceptors>
<global-results>
<result name="json" type="stream">
<param name="contentType">application/json</param>
<param name="inputName">jsonStream</param>
<param name="bufferSize">1024</param>
</result>
</global-results>
...
</package>所以当这个工作流被执行时,我得到了下面的异常-
java.lang.IllegalArgumentException: Can not find a java.io.InputStream with the name [jsonStream] in the invocation stack. Check the <param name="inputName"> tag specified for this action.
org.apache.struts2.dispatcher.StreamResult.doExecute(StreamResult.java:237)
org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186)
com.opensymphony.xwork2.DefaultActionInvocation.executeResult(DefaultActionInvocation.java:373)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:277)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)我不明白这怎么可能,因为我在jsonStream的拦截器中创建了公共get/set方法。此外,我还在getJsonStream方法中添加了一个sysout。原来它从来没有被称为。
任何指南针都会赏识。
发布于 2012-03-22 02:53:59
我相信你的做法是错误的,你没有使用拦截器的方式应该使用。拦截器实例在Actions.For之间共享--每个请求-- S2将创建一个新的操作实例,但是拦截器将被重用,这意味着拦截器是无状态的,您正在试图在拦截器中设置请求进程的状态。
我的建议是,不要试图将与请求处理相关的数据存储为不属于阻断器角色的数据。只需检查Ajax请求响应,并尝试查看返回的结果,在此基础上可以显示错误消息。
更新
在下面的线程handling.This中讨论了检查会话超时struts-2-session-timeout的可能解决方案之一
https://stackoverflow.com/questions/9811410
复制相似问题