有没有办法改变验证的顺序:Struts 2中的validate()与validation.xml?

问题描述 投票:0回答:2

我有一个

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

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

编辑:

我有想法在

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

java xml validation struts2 nullpointerexception
2个回答
3
投票

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

我之前已经通过检查

validate
方法中的错误解决了这个问题,如果存在错误则不继续。


1
投票

顺序始终相同,即硬编码顺序。

验证过程由

ValidationInterceptor
(至少版本2.3.8)执行。

此拦截器通过标准验证框架运行操作,该框架反过来根据任何验证规则(在

ActionClass-validation.xml
等文件中找到)检查操作,并添加字段级和操作级错误消息(前提是操作实现
 ValidationAware
)。该拦截器通常是堆栈中应用的最后一个(或倒数第二个)拦截器之一,因为它假设所有值都已在操作上设置。

如果在

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

操作请求的工作流程不会因该拦截器而改变。相反,此拦截器通常与

workflow
拦截器结合使用。

注意:由于此方法扩展了

MethodFilterInterceptor
,因此它能够决定是否仅适用于操作类中的选择性方法。请参阅
MethodFilterInterceptor
了解更多信息。


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

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

拦截器参数:

  • alwaysInvokeValidate
    - 默认为
    true
    。如果
    true
    validate()
    方法将始终被调用,否则不会。
  • programmatic
    - 默认为
    true
    。如果
    true
    并且操作是
    Validateable
    ,则调用
    validate()
    ,以及以
    "validate"
    开头的任何方法。
  • declarative
    - 默认为
    true
    。基于 XML 或注释执行验证。
© www.soinside.com 2019 - 2024. All rights reserved.