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
如何为 validation-constraints.xml 中定义的验证注册自定义 ConstraintMapping
struts2验证规则validation配置文件命名方式总结