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();
}

现在我的问题是仍然呈现剩余页面,并且我在应用程序服务器日志中收到错误,指出实体为空(因此某些元素未正确呈现)。我只想显示错误消息。

我应该返回一个字符串以便POST发出一个错误页面吗?但是,如果我选择这种方式,如何添加自定义错误消息?将字符串作为视图参数传递似乎根本不是一个好主意。

4

1 回答 1

3

在我看来,在这些情况下最好的办法是发送带有适当错误代码的 HTTP 响应(404表示未找到/无效,403表示禁止等):

将此实用程序方法添加到您的 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 回答