0

データベースで検索する必要があるビュー パラメータを持つ JSF2 ページがあります。そのエンティティのプロパティがページに表示されます。

ビューパラメータが欠落している/無効な場合を処理したいと思います

<f:metadata>
    <f:viewParam name="id" value="#{fooBean.id}" />
    <f:event type="preRenderView" listener="#{fooBean.init()}" />
</f:metadata>

コードは次のinit()とおりです。

String msg = "";
if (id == null) {
    msg = "Missing ID!";
}
else {
    try {
        entity = manager.find(id);
    } catch (Exception e) {
        msg = "No entity with id=" + id;
    }
}
if (version == null) {
    FacesUtils.addGlobalMessage(FacesMessage.SEVERITY_FATAL, msg);
    FacesContext.getCurrentInstance().renderResponse();
}

今私の問題は、残りのページがまだレンダリングされており、アプリケーション サーバー ログにエンティティが null であるというエラーが表示されることです (したがって、一部の要素が正しくレンダリングされません)。エラーメッセージだけを表示したい。

POSTエラーページへのaが発行されるように、文字列を返す必要がありますか? ただし、その方法を選択した場合、カスタム エラー メッセージを追加するにはどうすればよいですか? 文字列をビュー パラメーターとして渡すことは、まったくお勧めできません。

4

1 に答える 1

3

私の意見では、これらの場合に行う最善の方法は、適切なエラーコード(見つからない/無効の場合は404、禁止の場合は403など)を含むHTTP応答を送信することです。

FacesUtilsにこのユーティリティメソッドを追加します。

public static void responseSendError(int status, String message)
                           throws IOException {
    FacesContext facesContext = FacesContext.getCurrentInstance();
    facesContext.getExternalContext().responseSendError(status, message);
    facesContext.responseComplete();
}

次に、preRenderViewリスナーを次のように変更します。

public void init() throws IOException {
    if (id == null || id.isEmpty()) {
        FacesUtils.responseSendError(404, "URL incomplete or invalid!");
    }
    else {
        try {
            entity = manager.find(id);
        } catch (Exception e) { // <- are you sure you want to do that? ;)
            FacesUtils.responseSendError(404, "No entity found!");
        }
    }  
}
于 2012-07-27T12:48:11.160 に答える