2011-07-20 81 views
1

全部, 我正在嘗試寫什麼應該是Struts2操作的簡單驗證。我有一個字段必須包含0或一個正整數,所以我試圖使用內置在正則表達式驗證器中的Struts2來完成此操作。我使用的正則表達式是'^ \ d * $',並且我測試了outside of struts2並相信它應該滿足我的需求。 (例如它匹配'23',但不匹配'abc'或'-5')。Struts2負數的正則表達式驗證問題

但是,當我在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'時,我收到一條錯誤消息(如預期的那樣),但是' - '不是會觸發驗證失敗。如果它是第一個字符,我不知道爲什麼它允許' - '字符通過。

我會很感激任何Struts2相關的正則表達式技巧;請注意,我認爲這裏的錯誤是 與Struts2特別相關,它如何處理正則表達式,而不僅僅是一個正則表達式問題。 (fwiw - 當我嘗試這種模式時,我也遇到同樣的問題:'^ [0-9] * $')。

+1

我假設有一個原因,爲什麼你使用字符串類型的數字?否則,您可以編輯'editVO.capability.operationalQty'和整數並使用整數最小驗證器? – nmc

+0

我在我的動作中使用Integer字段作爲數字,但驗證在我們的struts2堆棧中進行類型轉換之前運行,因此驗證針對請求中的字符串運行。是的,我可以切換到使用整數和intRange驗證器的組合 - 事實上可能必須這樣做才能使其工作 - 這只是令人討厭,我無法弄清楚我目前的方法有什麼問題。 – elduff

+0

隨機猜測:嘗試禁用'trim',http://struts.apache.org/2.x/docs/regex-validator.html – Qtax

回答

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

它是從打開javadoc爲ValidationInterceptor w e得到以下內容:

/** 
* <!-- 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. 

而且這幾乎總結了它。

我認爲你的測試用例是通過單獨的類型轉換來解釋的。我懷疑參數是刪除字段錯誤,如果字段值已被重置,那麼驗證錯誤將不會被保留。

結論:Struts2正則表達式驗證沒有任何問題,至少在以預期的方式使用時是如此。

+0

是的,這是我重新思考我的迴應後得出的結論上面的@ nmc的評論。轉換髮生在驗證之前,因此當我接收到'abc','5'等輸入的'驗證'錯誤實際上是當Struts2嘗試轉換爲整數時的轉換錯誤。當它進行驗證時,轉換爲Integer已經發生,所以我猜測正則表達式驗證器只是被忽略(b/c該字段不是該字符串)。我最終改變我的xml使用int驗證與最小和最大params來完成我想要的。 – elduff