【问题标题】:InputText with validation does not work properly inside ui:repeat JSF 2.2.6带有验证的 InputText 在 ui:repeat JSF 2.2.6 中无法正常工作
【发布时间】:2014-07-07 20:55:01
【问题描述】:

我有以下 xhtml、验证器和 managedBean:

<h:form id="form">
<ui:repeat var="item" value="#{myBean.usersEmail}" varStatus="status">
    <p:inputText id="userEmail" value="#{item.email}">
        <f:validator validatorId="MyValidator"/>
    </p:inputText>

    <p:commandButton value="++++" update=":form" action="#{myBean.addEmail()}"  />

</ui:repeat>

</h:form>

@FacesValidator("MyValidator")
public class ValidationClass extends Validator {

    @Override
    public void validate(FacesContext ctx, UIComponent component, Object value) throws ValidatorException {
    String email = value.toString();
    EmailValidator validator = EmailValidator.getInstance();



    if(StringUtils.isNotBlank(email) && !validator.isValid(email)) {


        FacesMessage message = new FacesMessage();
        message.setSeverity(FacesMessage.SEVERITY_ERROR);
        message.setSummary("Email is not valid.");
        message.setDetail("Email is not valid.");
        ctx.addMessage("userEmail", message);

        throw new ValidatorException(message);
    }
}
}

@ManagedBean
public class MyBean{

    @Getter
    @Setter
    List<UserEmail> usersEmail = new ArrayList<UserEmail>();

    public void addEmail(){
        usersEmail.add(new UserEmail());
    }
}

public class UserEmail{

    @Getter
    @Setter
    String email = "";

}

电子邮件添加工作正常,直到第一次验证失败。 发生这种情况时,所有 inputText 组件都显示相同的值。 例如,首先我添加“user1@gmail.com”,这可以正常工作。 然后我添加“user2@gmail.com”,这也可以。 然后我将“user1@gmail.com”更改为“”,这会引发验证异常,显示在屏幕上,一切正常。 但后来我用“user3@gmail.com”更正了“”并提交,这一次所有的 inputText 都开始显示“user2@gmail.com”,即使我添加了一个新的 InputText,它也显示了“user2@gmail.com” .

似乎当验证失败时,ui:repeat 中的所有组件都会绑定到最后一项的值。有什么想法吗?

【问题讨论】:

  • 您对所有输入使用相同的 id="userEmail",您尝试不使用 id 吗?
  • 我确实做到了,但问题仍然存在。虽然我在 xhtml 中使用了相同的 id,但在 JSF 生成的 html 中,id 与 ui:repeat item id 连接。例如,“0:userEmail”、“1:userEmail”、“2:userEmail”等。所以我认为问题不在于。
  • 我们正面临着同样的问题。完全相同的场景和用例。我们再次降级到 2.2.5,问题就消失了。所以它必须是 Mojarra 2.2.6 中的一个错误
  • 升级到 2.2.7 - 问题已修复。所以它真的只影响2.2.6。我在 2.2.7 的变更日志中找不到任何相关的修复,所以这可能只是 2.2.6 中存在的另一个错误的副作用
  • 可能与这个问题有关:java.net/jira/browse/JAVASERVERFACES-3274

标签: validation jsf-2 repeat uirepeat


【解决方案1】:

我将实现更改为使用 JSTL 中的 c:forEach 标记,现在它工作正常,即使在 Mojarra 2.2.6 上也是如此,这就是我所做的:

 <c:forEach var="item" items="#{myBean.usersEmail}" varStatus="status">


 <p:inputText id="id${status.index}"   value="${item.email}" validator="MyValidator" />

 <p:message for="id${status.index}" />

 <p:commandButton value="+" update=":form" action="#{myBean.addEmail()}"  />

 </c:forEach>

【讨论】:

    猜你喜欢
    • 2013-09-06
    • 2013-07-25
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 2023-03-31
    相关资源
    最近更新 更多