В Struts2 перехватчики получают исключение для переменной экземпляра, которая правильно получает / устанавливает в перехватчике - PullRequest
3 голосов
/ 21 марта 2012

Эта проблема возникает при выполнении определенного рабочего процесса -

  1. Пользователь вошел в систему
  2. Срок действия сеанса истекает
  3. Пользователь пытается что-то сделать на текущей странице, котораязапускает запрос AJAX
  4. Поскольку сеанс истек, запрос ajax завершается неудачно
  5. Мне нужно отобразить сообщение об этом.

Теперь проблема возникает.У меня есть перехватчик, который правильно ловит, что сеанс истекает.Он также правильно определяет, что исходный запрос был 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 &lt;param name=&quot;inputName&quot;&gt; 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.Оказывается, это никогда не вызывается.

Любые указатели оценены.

1 Ответ

3 голосов
/ 22 марта 2012

Я считаю, что вы подходите здесь неправильно, и вы не используете перехватчики так, как их следует использовать.Экземпляры перехватчиков распределяются между действиями. Для каждого запроса S2 будет создавать новый экземпляр действия, но перехватчики будут использоваться повторно, что означает, что перехватчики не сохраняют состояние, и вы пытаетесь установить состояние процесса запроса в перехватчике.

Мое предложение: не пытайтесь хранить данные, относящиеся к обработке запроса, поскольку они не являются частью роли перехватчика.Просто проверьте ответ на запрос Ajax и попробуйте увидеть, какой результат вы получаете, основываясь на том, что вы можете показать сообщение об ошибке.

Обновление

Один из возможныхРешение для проверки времени ожидания сеанса. Это обсуждалось в следующем потоке struts-2-session-timeout

...