【问题标题】:Struts2 regex validation issue with negative numbers带有负数的 Struts2 正则表达式验证问题
【发布时间】:2011-07-21 06:08:21
【问题描述】:

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

但是,当我在 Struts2 中使用该正则表达式模式时,它无法给我一个负数验证错误。

这是我的 struts2 验证 xml sn-p:

<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]*$')。

【问题讨论】:

  • 我认为您使用字符串类型作为数字是有原因的?否则你可以制作editVO.capability.operationalQty 和整数并使用整数最小值验证器?
  • 我在操作中使用整数字段作为数字,但验证在我们的 struts2 堆栈中的类型转换之前运行,因此验证针对请求中的字符串运行。是的,我可以切换到使用整数和 intRange 验证器的组合 - 实际上可能必须这样做才能使其正常工作 - 我无法弄清楚我目前的方法有什么问题,这很烦人。
  • 随机猜测:尝试禁用trim, struts.apache.org/2.x/docs/regex-validator.html

标签: java regex struts2


【解决方案1】:
<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 正则表达式验证没有任何问题,至少在以预期方式使用时是这样。

【讨论】:

  • 是的,这也是我在重新思考我对上述@nmc 评论的回应后得出的结论。转换发生在验证之前,因此当 Struts2 尝试转换为整数时,我收到的输入“abc”、“5-”等的“验证”错误实际上是转换错误。当它进行验证时,已经发生了到整数的转换,所以我猜正则表达式验证器只是被忽略了(b/c 该字段此时不是字符串)。我确实最终更改了我的 xml 以使用带有最小和最大参数的 int 验证器来完成我想要的。
猜你喜欢
  • 2016-01-31
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多