Jsf 从ViewScope bean添加的FacesMessage未呈现
我有一个具有以下方法的ViewScope bean:Jsf 从ViewScope bean添加的FacesMessage未呈现,jsf,jakarta-ee,jsf-2,Jsf,Jakarta Ee,Jsf 2,我有一个具有以下方法的ViewScope bean: public Item getItem() { try { itemID = Integer.parseInt( FacesContext.getCurrentInstance().getExternalContext() .getRequestParameterMap().get("itemID")); } catch
public Item getItem()
{
try {
itemID = Integer.parseInt(
FacesContext.getCurrentInstance().getExternalContext()
.getRequestParameterMap().get("itemID"));
} catch(NumberFormatException ex) {
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(
FacesMessage.SEVERITY_ERROR, "Item lookup error", null));
return null;
}
return itemsDAO.findByID(itemID);
}
该方法采用ViewID参数,并使用itemsDAO
查找对象。我想通过捕获NumberFormatException
并将消息添加到其中,从而在itemID不是整数时显示faces消息。然而,这是行不通的。上述代码片段中的FacesMessage
未在以下视图标记中呈现h:messages globalonlly=“true”infoClass=“info”errorClass=“error”
我怀疑调用该方法时,FacesContext
不可用,但我不知道如何处理此异常
更新1:
关于使用viewParam使用内置转换和验证的建议。我不知道这在这种情况下会怎样。itemID是从一个“索引”视图传递的,该视图列出了所有项目,如下所示。每个项目标题都是指向viewItem页面的链接,itemID通过URL传递。在这种情况下,如果索引视图有许多项,如何使用viewParam将itemID传递给viewItem视图
index.xhtml
<code>
<ui:repeat var="item" value="#{ItemViewBean.items}">
<div id="item">
<h:link value="#{item.title}" outcome="viewItem">
<f:param name="itemID" value="#{item.id}"></f:param>
</h:link>
<p><h:outputText value="#{item.description}"></h:outputText> <br />
Address: <h:outputText value="#{item.address}"></h:outputText></p>
<span class="itemFooter">
Submitted By: <h:outputText value="#{item.user.username}"></h:outputText> On
<h:outputText value="#{item.postDate}"></h:outputText>
</span>
<hr />
</div>
</ui:repeat>
</code>
地址:
提交人:年月日
更新2:
我为这个问题想出了一个解决办法。如果发生异常,我会将ErrorFacesMessage放在Flash对象中,并重定向到某个错误页面。我仍然不明白为什么不能简单地将FacesMessage添加到FacesContext并显示在视图上。鉴于您正在遍历
外部上下文#getRequestParameterMap()
,您似乎正在拦截GET请求。假设它发生在getter方法()中,它似乎仅在引用项
属性的组件被呈现时执行
因此,假设上述假设为真,那么当在引用项
属性的组件之前的视图中声明
组件时,这个问题就会出现。现在向faces上下文添加新消息已经太迟了。
已在该点渲染
我至少想不出与这一具体问题症状相匹配的其他合理原因。基本上有两种解决方案:
移动到引用项
属性的组件之后,以便在添加faces消息后呈现该组件
在预渲染视图事件期间执行业务作业,最好结合
将请求参数设置为bean属性。您甚至可以将
单独与转换器结合使用,因为糟糕的getter方法的唯一任务是转换值
itemConverter
只是一个Converter
实现,其中请求参数转换为getAsObject()
方法中的Item
实例
另见:
viewItem
。更多详细示例,请参见“另请参见”链接。根据您的更新2:flash工作,因为消息是在呈现
之前添加的。不使用flash失败,因为消息是在呈现
后添加的。正如我在回答中试图解释的那样。谢谢巴卢斯克澄清这一点。我对viewParam标记有一个巨大的误解。这对我有用。感谢您对JSF标签的支持和所有精彩的回答。
<f:metadata>
<f:viewParam id="itemID" name="itemID" value="#{bean.item}"
required="true" requiredMessage="Invalid page access. Please use a link from within the system."
converter="itemConverter" converterMessage="Unknown item ID."
/>
</f:metadata>
<h:message for="itemID" />
private Item item; // +getter +setter