次のメソッドを持つ 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
。NumberFormatException
をキャッチしてそこにメッセージを追加することにより、itemID が整数でない場合に FacesMessage を表示したかったのです。ただし、これは機能しません。上記FacesMessage
のコード スニペットは、次のビュー タグ内ではレンダリングされません。h:messages globalOnly="true" infoClass="info" errorClass="error"
メソッドが呼び出されるまでに が利用できないと思わFacesContext
れますが、この例外を処理する方法がわかりません。
更新 1:
viewParam を使用して組み込みの変換と検証を利用するという提案について。この場合、これがどのように機能するかわかりません。itemID は、以下に示すようにすべてのアイテムが一覧表示される「インデックス」ビューから渡されます。各アイテムのタイトルは、URL を介して渡される itemID を持つ viewItem ページへのリンクです。この場合、index ビューに多くのアイテムがある場合、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: この問題の回避策を 1 つ思いつきました。例外が発生した場合は、エラー FacesMessage を Flash オブジェクトに入れ、何らかのエラー ページにリダイレクトします。FacesMessage を FacesContext に単純に追加してビューに表示できない理由はまだわかりません。