gpt4 book ai didi

jsf - 如何从 FacesContext 中删除 FacesMessages?

转载 作者:行者123 更新时间:2023-12-03 20:54:26 25 4
gpt4 key购买 nike

在我的屏幕上,我有一个下拉(选择框),在选择该下拉列表中的任何选项时,我使用 javascript/css 在选择框旁边显示一个或多个文本框 - display:none 和 display:block。所有这些输入控件都采用相同的 jsf 形式。每个输入控件都有自己的验证器。问题是假设用户从选择框中选择 option1 并且没有为 inputbox1 输入值或输入错误的值,我在验证器中添加了一个自定义 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 请求时显示相关消息

谢谢

最佳答案

据我所知这还不够,因为在

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();
}
}

另请注意,这非常脆弱,因为它依赖于实现细节,但我找不到更好的方法:(

关于jsf - 如何从 FacesContext 中删除 FacesMessages?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2919132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com