如何禁用Struts Validation Interceptor?

时间:2013-05-14 19:29:09

标签: java struts2

我正在尝试构建一个javascript / ajax上传器,它将表单/文件上传提交给一个动作。但是,在提交表单时,验证拦截器会阻止我的操作由于某种原因而运行,并返回“输入”作为结果。我不知道为什么,但我希望它停止。

如何仅为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>

2 个答案:

答案 0 :(得分:4)

最简单的方法(如a quick glance at the docs所示)是将AnnotationValidationInterceptor放入堆叠中,并使用@org.apache.struts2.interceptor.validation.SkipValidation

注释您的方法

答案 1 :(得分:4)

以下是您可以绕过针对特定操作的验证的方法。 (我假设您不想为整个应用程序禁用Interceptor。)

<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结果代码的视图。

修改
我认为嵌套堆栈会导致参数覆盖的语法出现问题,我之前从未尝试过<stack-name>.<interceptor-name>.excludeMethods。你可以尝试一下。 更新:以上是有效的。 :)

但是,您可以将其重命名为execute()(已在排除列表中)并将input()添加到method="input",而不是尝试排除<action>。对文件上传也有意义。

你也可以为你的行动覆盖validate()(虽然我个人更愿意通过struts.xml声明性地做到这一点)

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