2012-02-23 110 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