在我的屏幕中,我有一个下拉(选择框),在选择该下拉列表中的任何选项时,我会在选择框旁边显示一个或多个文本框,使用javascript / css - display:none并显示:块。所有这些输入控件都采用相同的jsf格式。每个输入控件都有自己的验证器。问题是假设用户从选择框中选择 option1 并且没有为 inputbox1输入值或输入错误的值,我在Validator中添加了一个自定义FacesMessage并显示适当地假设用户第二次选择 option2 并为 inputbox2 输入错误的值,然后在验证器中添加另一个FacesMessage。但是现在两个消息都显示了 - 意思是 - inputbox1和inputbox2的消息 - 这是错误的我的假设是,这是因为它们以相同的形式存在,并且它们的实例在FacesContext和UIView。我决定以这种方式删除邮件
Iterator<FacesMessage> msgIterator = FacesContext.getCurrentInstance().getMessages();
while(msgIterator.hasNext())
{
msgIterator.next();
msgIterator.remove();
}
但这有时会产生java.util.NoSuchElementException org.apache.myfaces.shared_impl.renderkit.html.HtmlMessagesRendererBase $ MessagesIterator.next
所以有2个问题:
1)以这种方式删除FacesMessages有什么问题?我正在使用myfaces-api-1.2.3.jar和myfaces-impl-1.2.3.jar
2)有没有更好的方法来处理我的场景?我只想在每次处理jsf请求时显示相关消息
由于
答案 0 :(得分:5)
据我所知,这还不够,因为在
org.apache.myfaces.context.servlet.FacesContextImpl
(版本:2.0.15,修订版:1364593),有2个邮件列表(_orderedMessages
和_messages
),您的方法只清除_orderedMessages
。
要清除_messages
,请执行以下操作:
Iterator<String> itIds = FacesContext.getCurrentInstance().getClientIdsWithMessages();
while (itIds.hasNext()) {
List<FacesMessage> messageList = FacesContext.getCurrentInstance().getMessageList(itIds.next());
if (!messageList.isEmpty()) { // if empty, it will be unmodifiable and throw UnsupportedOperationException...
messageList.clear();
}
}
请注意,这非常脆弱,因为它依赖于实施细节,但我找不到更好的方法:(
答案 1 :(得分:3)
问题不在于我无法从FacesContext中删除消息。问题是,每次提交表单时,几乎没有输入控件(使用display:none显示),这些控件保留了一些值(),因此Validators和Backing Bean代码为那些不可见的输入控件添加了FacesMessages。 FacesContext的。现在,每次更改选择选项时,我都清除了其他不必要的表单字段,因此不会添加消息。
答案 2 :(得分:0)
我不使用MyFaces,所以我不能详细说明这一点,但在Sun RI(Mojarra)中,大约1。5年前版本1.2_07修复了不可删除的facemessages的错误。
因此,为了达到您想要的效果,请尝试将MyFaces升级到最新版本(他们可能也修复了相同的错误)或替换为Mojarra。
答案 3 :(得分:0)
FacesContext context = FacesContext.getCurrentInstance();
Iterator<FacesMessage> it = context.getMessages();
while ( it.hasNext() ) {
it.next();
it.remove();
}
答案 4 :(得分:-1)
if (FacesContext.getCurrentInstance().getMessages() != null) {
FacesContext.getCurrentInstance().getMessages().remove();
}