我有一个具有以下方法的 ViewScoped bean:
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
. 如果 itemID 不是整数,我想通过捕获NumberFormatException
并在其中添加消息来显示 FacesMessage。然而,这不起作用。上面的FacesMessage
代码片段中的不呈现在下面的视图标签内h:messages globalOnly="true" infoClass="info" errorClass="error"
我怀疑在FacesContext
调用该方法时它不可用,但我不知道如何处理这个异常。
更新1:
关于使用 viewParam 使用内置转换和验证的建议。我不知道在这种情况下这将如何工作。itemID 是从“索引”视图传递的,其中列出了所有项目,如下所示。每个项目标题都是指向 viewItem 页面的链接,其中 itemID 通过 URL 传递。鉴于索引视图有很多项目,在这种情况下,如何使用 viewParam 将 itemID 传递给 viewItem 视图?
索引.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:我想出了一个解决这个问题的方法。如果发生异常,我将错误 FacesMessage 放在 Flash 对象中并重定向到某个错误页面。我仍然不明白为什么不能简单地将 FacesMessage 添加到 FacesContext 并显示在视图上。