validation.xml 之后的 validate() 方法

Posted

技术标签:

【中文标题】validation.xml 之后的 validate() 方法【英文标题】:validate() method after validation.xml 【发布时间】:2013-05-06 17:51:40 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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


首先,它检查 declarative 验证是否启用并执行,然后检查 programmatic 验证是否启用并执行。

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

拦截器参数:

alwaysInvokeValidate - 默认为 true。如果为 true,则将始终调用 validate() 方法,否则不会。 programmatic - 默认为 true。如果为 true 并且操作是 Validateable,则调用 validate(),以及任何以“validate”开头的方法。 声明性 - 默认为真。基于 xml 或注解执行验证。

【讨论】:

谢谢,但不幸的是我两者都需要。我想我必须坚持非空验证。 @Armaggedon 没有什么能阻止你同时拥有这两者,直到你影响默认值,但你不能改变拦截器的执行顺序或编写你自己的拦截器进行验证。而且顺序不是您在问题中发布的内容,而是在我的答案中发布的内容。【参考方案2】:

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

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

【讨论】:

以上是关于validation.xml 之后的 validate() 方法的主要内容,如果未能解决你的问题,请参考以下文章

XXXAction-validation.xml文件中报错:Referenced file Contains errors

RegisterAction-validation.xml

如何为 validation-constraints.xml 中定义的验证注册自定义 ConstraintMapping

struts2验证规则validation配置文件命名方式总结

(转)struts2:数据校验,通过XWork校验框架实现(validation.xml)

struts2验证框架方法一