3

我有一个-validation.xml文件来检查表单的字段是否为空以及那种简单的验证。我还有一种validate()方法(从 扩展ActionSupport)来检查更复杂的事情。但是当我发送表单时,它会在 XML 文件之前检查方法,因此如果字段为空,NullPointerException则会出现一个。至少这是我认为正在发生的事情。

所以我的问题是,有没有办法改变验证的顺序,所以在方法之前检查 XML?

编辑:我想在方法中检查 String 是否不为空,validate()这样我就可以避免这个问题,但我认为这不是最明智的做法。

4

2 回答 2

3

拦截器确实首先检查 XML,但如果 IIRC 发现错误,它不会停止验证。我相信我有一个补丁,用一个标志控制。

我之前通过检查validate方法中的错误解决了这个问题,如果存在错误则不继续。

于 2013-05-12T19:03:55.253 回答
1

顺序始终为一,即硬编码顺序。

验证过程由ValidationInterceptor执行(至少版本 2.3.8)。

此拦截器通过标准验证框架运行该操作,该框架反过来根据任何验证规则(在 ActionClass-validation.xml 等文件中找到)检查该操作并添加字段级和操作级错误消息(前提是该操作实现验证意识)。此拦截器通常是堆栈中应用的最后一个(或倒数第二个)拦截器之一,因为它假定所有值都已在操作上设置。

如果在 excludeMethods 参数中指定了被调用方法的名称,则此拦截器不执行任何操作。excludeMethods 接受以逗号分隔的方法名称列表。例如,如果您将 excludeMethods 参数设置为“input, back”,则此拦截器将跳过对 foo!input.action 和 foo!back.action 的请求。

动作请求的工作流不会因为这个拦截器而改变。相反,此拦截器通常与工作流拦截器结合使用。

注意:由于此方法从 MethodFilterInterceptor 扩展而来,因此它能够决定它是否仅适用于操作类中的选择性方法。有关详细信息,请参阅 MethodFilterInterceptor。


首先,它检查是否启用了声明式验证并执行此操作,然后检查是否启用了编程验证并执行此操作。

您可以通过拦截器参数打开/关闭每种类型的验证。

拦截器参数:

  • alwaysInvokeValidate - 默认为 true。如果为真 validate() 方法将始终被调用,否则不会。
  • 程序化 - 默认为 true。如果为 true 并且操作是 Validateable,则调用 validate() 以及任何以“validate”开头的方法。
  • 声明性 - 默认为 true。基于 xml 或注释执行验证。
于 2013-05-12T17:04:07.247 回答