【发布时间】:2012-12-20 16:33:18
【问题描述】:
我有一个 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。然而,这不起作用。上面代码 sn-p 中的FacesMessage 不会在下面的视图标签h:messages globalOnly="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: 我想出了一个解决这个问题的方法。如果发生异常,我将错误 FacesMessage 放在 Flash 对象中并重定向到某个错误页面。我仍然不明白为什么不能简单地将 FacesMessage 添加到 FacesContext 并显示在视图上。
【问题讨论】:
-
你怎么知道这完全行不通?您确定正在调用 addMessage 方法吗?你有错误吗?您是否在执行 AJAX 请求(如果是,则必须更新 h:messages)?
-
@elias 我知道它不起作用,因为 h:messages 标签是空的,如果我故意通过将 itemID 设置为字符串来在它需要一个整数时导致异常。
标签: jsf jakarta-ee jsf-2