Нет перенаправления цепочки с Jakarta в Struts2 (загрузка больших файлов)

Я делаю новый проект с помощью struts2. Все хорошо, но я не знаю, что происходит в этом случае.

В проекте есть цепные перенаправления, когда бизнес-логика дает сбой, он возвращается к последнему JSP (последнее действие), чтобы успешно перезагрузить всю страницу без работы по программированию (также перезагружается старый запрос).

В любом случае, когда Jakarta обнаруживает, что пользователь пытается загрузить большой файл (конфигурация по умолчанию — 20 МБ), логика действия знает об этом и принудительно перенаправляет цепочку на последнее действие.

Я отлаживаю эту логику. У меня есть перехватчик, который делает несколько вещей в типичной строке:

result = invocation.invoke();

Когда Jakarta принудительно перенаправляет цепочку, перехватчик перехватывает этот новый запрос, но не достигает действия с помощью метода вызова.

Я не знаю, почему это происходит. Когда одно и то же действие вызывает такое же перенаправление цепочки, поскольку другие проверки, такие как перехватчик FileUpload для struts2 или проверки owns, работают хорошо.

Я решил избежать перенаправления в программе, но я хочу знать, почему я не могу использовать свой обычный режим.

Некоторые части файла struts.xml:

<constant name="struts.multipart.maxSize" value="20971520" />

Результатом MostrarResumenSubsanacion является следующее действие, если все валидации хорошие.

Результатом действия MostrarRespuestaSubsanaciones является последнее действие в случае сбоя какой-либо проверки.

Результатом ErrorJakarta является новая строка для решения проблемы.

<action name="MostrarResumenSubsanacion" class="struts.expedientes.subsanaciones.MostrarResumenSubsanacion">
    <param name="conseguirConexion">SI</param>
    <param name="seguimiento">SI</param>
    <interceptor-ref name="interceptorFileStack"></interceptor-ref>
    <result name="MostrarRespuestaSubsanaciones" type="chain">MostrarRespuestaSubsanaciones</result>
    <result name="ErrorJakarta">/forms/struts/expedientes/subsanaciones/ventanaRespuestaSubsanacion.jsp</result>
    <result name="MostrarResumenSubsanacion">/forms/struts/expedientes/comun/ventanaResumen.jsp</result>
</action>


<action name="MostrarRespuestaSubsanaciones" class="struts.expedientes.subsanaciones.MostrarRespuestaSubsanaciones">
    <param name="conseguirConexion">SI</param>
    <param name="seguimiento">SI</param>
    <interceptor-ref name="interceptorBaseStack"></interceptor-ref>
    <result name="MostrarVentanaSubsanaciones">/forms/struts/expedientes/subsanaciones/ventanaRespuestaSubsanacion.jsp</result>
    <result name="input">/forms/struts/expedientes/subsanaciones/ventanaRespuestaSubsanacion.jsp</result>
</action>

person Pevi    schedule 18.01.2016    source источник


Ответы (1)


  1. Использование типа результата Chain не рекомендуется; попробуйте вместо этого использовать redirectAction (или dispatcher).

  2. Каждый запрос в Struts2:

    • passes through a stack of interceptor,
    • в конце концов достичь действия,
    • затем фильтруется назад через тот же стек перехватчика, запуская код после строки invocation.invoke(); (если есть);
  3. Если происходит что-то плохое (но исправимое), выдается результат INPUT; в противном случае, если происходит что-то очень плохое, генерируется исключение.

Затем, если вы достигаете порога в 20 МБ, где-то возвращается результат INPUT вместо обычного (плохого) процесса цепочки.

Должно быть легче испортить то, что именно происходит, посмотрев определение обоих ваших стеков перехватчиков, но с приведенной выше информацией вы сможете найти проблему быстрее, чем обновлять вопрос.

person Andrea Ligios    schedule 18.01.2016
comment
Большое спасибо!! Решено изменить только тип redirectAction на цепочку. - person Pevi; 18.01.2016