Эта проблема возникает при выполнении определенного рабочего процесса -
- Пользователь вошел в систему
- Срок действия сеанса истекает
- Пользователь пытается что-то сделать на текущей странице, котораязапускает запрос AJAX
- Поскольку сеанс истек, запрос ajax завершается неудачно
- Мне нужно отобразить сообщение об этом.
Теперь проблема возникает.У меня есть перехватчик, который правильно ловит, что сеанс истекает.Он также правильно определяет, что исходный запрос был 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)
Я не понимаю, как это возможно, так как я создаю общедоступные методы get / set в перехватчике для jsonStream
.Также я ставлю sysout в методе getJsonStream
.Оказывается, это никогда не вызывается.
Любые указатели оценены.