带负数的Struts2正则表达式验证问题

时间:2011-07-20 19:36:26

标签: java regex struts2

全部,   我正在尝试编写Struts2操作的简单验证。我有一个必须包含0或正整数的字段,所以我试图使用内置的regex验证器中的Struts2来完成此任务。我正在使用的正则表达式是'^ \ d * $',我测试了outside of struts2并认为它应该满足我的需求。 (例如,它匹配'23',但不匹配'abc'或'-5')。

然而,当我在Struts2中使用该正则表达式模式时,它无法给出负数的验证错误。

这是我的struts2验证xml片段:

<field name="editVO.capability.operationalQty">
        <field-validator type="regex">
            <param name="expression"><![CDATA[^\d*$]]></param>
         <message key="errors.number"/>
         </field-validator>
</field>

以下是我在单元测试此验证时看到的一些结果:

Input  Validation Passes?  Expected Result?
23          Yes            Yes 
abc         No             Yes
-5          Yes            No 
%5          No             Yes 
5-          No             Yes 
a5          No             Yes

从上面的结果可以看出,当我运行单元测试(或通过应用程序测试)时,当我输入'abc'或'5'时,我得到一条错误消息(如预期的那样),但是' - 5' NOT 会触发验证失败。我不知道为什么它允许' - '字符通过,如果它是第一个字符。

我很欣赏任何Struts2相关的正则表达式提示;请注意,我相信这里的错误是 某种程度上与Struts2有关,以及它如何处理正则表达式,而不仅仅是一个正则表达式的问题。 (fwiw - 当我尝试这种模式时,我也遇到了同样的问题:'^ [0-9] * $')。

1 个答案:

答案 0 :(得分:2)

<field-validator type="regex">

这是一个字段验证器,它要求已经设置了操作字段才能使其工作,它不会对请求起作用。它的功能由验证拦截器提供。

要确认这一点,请参阅来源(实际上并没有那么糟糕):

验证拦截器在struts-default.xml中定义如下:

<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>

org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor

AnnotationValidationInterceptor扩展com.opensymphony.xwork2.validator.ValidationInterceptor

从ValidationInterceptor的开头javadoc我们得到以下内容:

/**
 * <!-- START SNIPPET: description -->
 *
 * This interceptor runs the action through the standard validation framework, which in turn checks the action against
 * any validation rules (found in files such as <i>ActionClass-validation.xml</i>) and adds field-level and action-level
 * error messages (provided that the action implements {@link com.opensymphony.xwork2.ValidationAware}). This interceptor
 * is often one of the last (or second to last) interceptors applied in a stack, as it assumes that all values have
 * already been set on the action.

这几乎总结了它。

我认为您的测试用例仅通过类型转换来解释。我怀疑params正在删除字段错误,如果字段值已被重置,则保留验证错误没有任何意义。

总结:Struts2正则表达式验证没有任何问题,至少在预期的方式使用时。