2016-01-18 3 views
1

Я делаю новый проект с struts2. Все хорошо, но я не знаю, что происходит в этом случае.Нет перенаправления цепи с Джакартой в Struts2 (Загрузка больших файлов)

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

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

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

result = invocation.invoke(); 

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

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

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

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

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

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

Результат 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> 

ответ

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

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

    • проходит через стек перехватчик,
    • в конечном итоге достичь Action,
    • затем фильтруют в обратном направлении через ту же стек-перехватчик, выполнение кода после того, как строка invocation.invoke(); (при наличии);
  3. Если произошло что-то плохое (но возможно излечимое), an INPUT result is thrown; в противном случае, если произойдет что-то очень плохое, возникает исключение.

Тогда, если вы ударяете порог 20 Мб, INPUT возвращается результат где-то, вместо нормального (плохого) СЦЕПЛЕНИЯ процесса.

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

+0

Большое спасибо! Решено изменить только тип redirectAction на цепочку. – Pevi