我正在尝试构建一个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>
答案 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);
}
}