我有一个带有view参数的JSF2页面,必须在数据库中查找。 然后在页面上显示该实体的属性。
现在我想处理view参数缺失/无效的情况
<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
到错误页面吗?
但是,如果我选择这种方式,如何添加自定义错误消息?传递字符串作为视图
参数似乎不是一个好主意。
答案 0 :(得分: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!");
}
}
}