全部, 我正在尝试编写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] * $')。
答案 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正则表达式验证没有任何问题,至少在预期的方式使用时。