Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Validation 带有验证的InputText在ui内无法正常工作:重复JSF 2.2.6_Validation_Jsf 2_Repeat_Uirepeat - Fatal编程技术网

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

Validation 带有验证的InputText在ui内无法正常工作:重复JSF 2.2.6,validation,jsf-2,repeat,uirepeat,Validation,Jsf 2,Repeat,Uirepeat,我有以下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"/> &

我有以下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 = "";

}

@FacesValidator(“MyValidator”)
公共类ValidationClass扩展了验证器{
@凌驾
公共无效验证(FacesContext ctx、UIComponent组件、对象值)引发ValidatorException{
字符串email=value.toString();
EmailValidator validator=EmailValidator.getInstance();
if(StringUtils.isNotBlank(电子邮件)和&!validator.isValid(电子邮件)){
FacesMessage message=新的FacesMessage();
message.setSeverity(FacesMessage.SEVERITY_错误);
message.setSummary(“电子邮件无效”);
message.setDetail(“电子邮件无效”);
添加消息(“用户电子邮件”,消息);
抛出新的验证器异常(消息);
}
}
}
@ManagedBean
公共类MyBean{
@吸气剂
@塞特
List usersEmail=new ArrayList();
公开信{
添加(新的UserEmail());
}
}
公共类用户电子邮件{
@吸气剂
@塞特
字符串email=“”;
}
电子邮件添加在第一次验证失败之前一直有效。 发生这种情况时,所有inputText组件都显示相同的值。 例如,首先我添加“user1@gmail.com“,这工作正常。 然后我加上“user2@gmail.com“,这也行。 然后我改变”user1@gmail.com“对于“”,这将引发一个验证异常,该异常显示在屏幕上,并且一切仍然正常。 但是我用user3@gmail.com“并提交,此时所有inputText开始显示”user2@gmail.com,即使我添加了新的InputText,也会显示user2@gmail.com".


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

我将实现更改为使用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>


您对所有输入都使用相同的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中的一个bug-问题已经解决。所以它实际上只影响2.2.6。我在2.2.7的变更日志中找不到任何相关修复程序,因此这可能只是2.2.6中存在的另一个错误的副作用,它可能与此问题有关: