带验证的InputText在ui中无法正常工作:重复JSF 2.2.6

时间:2014-07-07 20:55:01

标签: validation jsf-2 repeat uirepeat

我有以下xhtml,validator和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中的所有组件都绑定到最后一项的值。有什么想法吗?

1 个答案:

答案 0 :(得分: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>