2013-05-14 111 views
3

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

护理(谁)来解释downvotes(质疑和解答)和投票关闭? – leonbloy

+1

@leonbloy有一个特定的用户态度问题;最终的解决办法是不要担心,'cuz仇恨者会讨厌。 –

+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> 

验证拦截器只记录错误。它是工作流程拦截器,用于检查是否记录了任何验证错误,是否将重定向映射到input结果代码的视图。

编辑:
我觉得嵌套堆栈造成麻烦与语法参数覆盖,我从来没有尝试过<stack-name>.<interceptor-name>.excludeMethods。你可以尝试一下。更新:以上作品。 :)

但是,而不是试图排除​​您可以将其重命名为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