2013-05-14 2 views
3

Я пытаюсь создать javascript/ajax uploader, который отправляет файл/файл в действие. Однако, когда форма отправляется, перехватчик проверки не позволяет моему действию запускаться по какой-то причине и возвращает результат «входом». Я не уверен, почему, но я бы хотел, чтобы он остановился.Как отключить перехватчик проверки Struts?

Как отключить проверку перехватчика только для MyAction.execute()? Вот мой перехватчики код из struts.xml:

<interceptors> 
     <interceptor name="appInit" 
      class="com.example.myApp.interceptors.AppInit"> 
     </interceptor> 
     <interceptor-stack name="appDefault"> 
     <interceptor-ref name="servletConfig"/> 
     <interceptor-ref name="appInit" /> 
      <interceptor-ref name="defaultStack"> 
      <param name="exception.logEnabled">true</param> 
      <param name="exception.logLevel">ERROR</param> 
      <param name="params.excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*,submit</param> 
      </interceptor-ref> 
     </interceptor-stack> 
    </interceptors> 
+3

Care (кто), чтобы объяснить downvotes (на вопрос и ответы) и голосовать, чтобы закрыть? – leonbloy

+1

@leonbloy Есть определенный пользователь с проблемой отношения; окончательное решение - не беспокоиться об этом, потому что ненавистники будут ненавидеть. –

+1

Эх, он он .. Кто-то проголосовал за всех нас! И отсутствие какой-либо противоречивой точки зрения доказывает, насколько он понял этот вопрос или понимает Struts 2 вообще. Думаю, у него тоже есть проблема проверки. :) –

ответ

4

Вот как вы могли бы идти о обходя валидацию конкретное действие. (Я предполагаю, что вы не хотите, чтобы отключить перехватчик для всего приложения.)

<action name="MyAction" class="pkg.path.to.MyAction"> 
    <interceptor-ref name="appDefault"> 
    <param name="validation.excludeMethods">execute</param> 
    <param name="workflow.excludeMethods">execute</param> 
    </interceptor-ref> 
    <result>Success.jsp</result> 
</action> 

Перехватчик проверки только регистрирует ошибку. Это перехватчик Workflow, который проверяет, были ли зарегистрированы какие-либо ошибки проверки и если да, перенаправляется на представление, сопоставленное с кодом результата input.

EDIT:
Я думаю, что вложенные стеки вызывают проблемы с синтаксисом для параметра переопределения, и я никогда не пробовал <stack-name>.<interceptor-name>.excludeMethods раньше. Однако вы можете попробовать.Обновление: Вышеупомянутые работы. :)

Но, вместо того, чтобы пытаться исключить execute() вы можете переименовать его в input() (который уже включен в список исключений) и добавить method="input" к вашему <action>. Это также имеет смысл для загрузки файлов.

Вы также можете переопределить validate() для вашего действия (хотя я лично предпочитаю делать это декларативно через struts.xml)

public class MyAction extends ActionSupport { 
    ... 
    @Override 
    public void validate() { 
    setFieldErrors(null); 
    } 
} 
+0

Не повезло, такая же ошибка, как раньше. Если я удалю перехватчик 'defaultStack', форма будет отправлена ​​правильно, но есть ли способ получить доступ к загруженному файлу и другим полям формы без перехватчика' defaultStack'? –

+0

Нет, нет. Не пойди так. Попробуйте также с явным исключением при проверке. –

+0

Эта вещь работает, но в вашем случае у нас есть вложенные стеки.Не уверен, что это вызывает какие-либо проблемы с синтаксисом ' .excludeMethods'. –

3

Самый простой способ (как a quick glance at the docs показывают) должен поместить AnnotationValidationInterceptor в вас стек, и аннотировать метод с @org.apache.struts2.interceptor.validation.SkipValidation

+0

Любые идеи, как это сделать без аннотаций? –

+0

+1. И учитывая тот факт, что в большинстве случаев можно было бы расширить пакет [* struts-default.xml *] (http://struts.apache.org/release/2.3.x/docs/struts-defaultxml.html), который ** уже ** содержит конфигурацию для [* AnnotationValidationInterceptor *] (http://struts.apache.org/development/2.x/struts2-core/apidocs/org/apache/struts2/interceptor/validation/AnnotationValidationInterceptor.html), добавление аннотации «SkipValidation» - это все, что вам нужно. Быстро и просто. Спасибо за подсказку) – informatik01

Смежные вопросы