【发布时间】: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 中存在的另一个错误的副作用
标签: validation jsf-2 repeat uirepeat