2012-02-23 151 views
4

空字段我有以下輸入字段:驗證與直列驗證方法和驗證程序類

<h:inputText value=".." validator="#{labController.validateValue}"/> 

如果該字段爲空,將沒有被驗證(在labControllervalidateValue不叫)。

但是,使用一個單獨的驗證器類:

<h:inputText value=".." > 
    <f:validator validatorId="labDateValidator"/> 
</h:inputText> 

然後其validate方法很好地使用空的輸入字段甚至稱?

這就是我所觀察到的。這種行爲是依賴於實現還是版本(我正在使用Mojarra 2.1)?

背景是,我想使用我自己的方法/類來進行所有驗證任務,包括所需的驗證。它僅適用於驗證程序類嗎?

回答

6

您已經在JSF中發生了疏忽。 validator包裝在MethodExpressionValidator中,根據其validate()方法的來源,當值爲null時,確實會跳過驗證。

if (value != null) { 
    try { 
     ELContext elContext = context.getELContext(); 
     methodExpression.invoke(elContext, new Object[]{context, component, value}); 
     ... 

這不考慮新的JSF 2.0 javax.faces.VALIDATE_EMPTY_FIELDS上下文參數默認爲true。它實際上應該和UIInput#validate()一樣。

if (!isEmpty(newValue) || validateEmptyFields(context)) { 
    try { 
     ELContext elContext = context.getELContext(); 
     methodExpression.invoke(elContext, new Object[]{context, component, value}); 
     ... 

這已經被報告爲Mojarra issue 1508。我投了票,並添加了一條新評論來喚醒他們。

+0

感謝您的澄清,BalusC。幸運的是,我可以將我的驗證方法外包給驗證器類,而不會出現任何問題。 (關於錯誤頁面的評論:「這些都是最新的GF 3.1 M6!」:-) – 2012-02-23 15:32:14

+0

這是1年前發佈的。顯然還沒有完成:) – BalusC 2012-02-23 15:33:46

+0

@MattHandy:我在這裏有不同的東西:對於'p:inputText',我可以在'p:inputText'或'f:validator'中使用'validator'屬性。但對於'p:selectOneMenu',只有'f:validator'工作。我們知道JSF 2.2何時會推出嗎? – 2012-03-08 19:42:31