【问题标题】:Validating empty fields with inline validation method and validator class使用内联验证方法和验证器类验证空字段
【发布时间】:2012-03-13 23:26:49
【问题描述】:

我有以下输入字段:

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

如果该字段为空,则不会对其进行验证(labController 中的validateValue 不会被调用)。

但使用单独的验证器类:

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

那么即使输入字段为空,它的validate 方法也能被调用?

这是我观察到的。这种行为是否取决于实现或版本(我使用的是 Mojarra 2.1)?

背景是我想将我自己的方法/类用于所有验证任务,包括所需的验证。它仅适用于验证器类吗?

【问题讨论】:

    标签: validation jsf-2


    【解决方案1】:

    您在 JSF 中遇到了疏忽。 validator 包裹在 MethodExpressionValidator 中,根据其 validate() 方法的来源,当值为 null 时确实会跳过验证。

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

    这不考虑默认为true 的新JSF 2.0 javax.faces.VALIDATE_EMPTY_FIELDS 上下文参数。它实际上应该与UIInput#validate() 做同样的事情。

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

    这已被报告为Mojarra issue 1508。我已经投票并添加了一条新评论来唤醒他们。

    【讨论】:

    • 感谢 BalusC 的澄清。幸运的是,我可以毫无问题地将我的验证方法外包给验证器类。 (在bug页面评论:“这些最迟都会在GF 3.1 M6上完成!”:-)
    • 发布于 1 年多前。显然还没有完成:)
    • @MattHandy:我有一些不同之处:对于p:inputText,我可以在p:inputTextf:validator 中同时使用validator 属性。但是对于p:selectOneMenu,只有f:validator 有效。我们知道 JSF 2.2 什么时候发布吗?
    猜你喜欢
    • 2020-05-20
    • 2011-12-17
    • 2018-09-08
    • 1970-01-01
    • 2011-07-23
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    相关资源
    最近更新 更多