在JSF管理的bean构造函数中,我使用请求参数从数据库中加载实体。有时,该实体并不存在于数据库中,我想显示其他带有404消息的JSF(.xhtml)页面。
以下是受管理bean的示例:
上述页面在数据成功加载时才能正常工作。
问题:
当实体不存在且我发送404错误代码时,JSF仍会处理第一页表达式语言中定义的方法。这种行为会导致托管bean抛出NullPointerException和HTTP 500 ERROR CODE。我的404错误页面没有被调用。我不知道为什么。
即使数据库中找到实体,我也尝试发送404错误,404错误页面也可以正常工作。
有人能向我解释一下JSF的这种行为吗?或者提供一些不改变URL的方式来显示404错误页面?
以下是受管理bean的示例:
@ManagedBean(name = "someBean")
@RequestScoped
public class SomeBean implements Serializable {
private static final long serialVersionUID = 1L;
private SomeData someData;
public SomeBean() throws IOException {
someData = ... loads from database using JPA features
if(someData == null){
HttpServletResponse response = (HttpServletResponse) FacesContext
.getCurrentInstance().getExternalContext().getResponse();
response.sendError(404);
}
}
public SomeData getSomeData(){
return someData;
}
}
我配置了类似这样的web.xml文件:
<error-page>
<error-code>404</error-code>
<location>/404.xhtml</location>
</error-page>
我有一个JSF页面来处理由托管bean加载的实体。当实体存在时,我将在页面中使用它。就像这样:
<h1>#{someBean.someEntity.name}</h1>
<h2>#{someBean.someEntity.description}</h2>
<ui:repeat value="#{someBean.someEntity.books}" var="book">
// ..........
</ui:repeat>
上述页面在数据成功加载时才能正常工作。
问题:
当实体不存在且我发送404错误代码时,JSF仍会处理第一页表达式语言中定义的方法。这种行为会导致托管bean抛出NullPointerException和HTTP 500 ERROR CODE。我的404错误页面没有被调用。我不知道为什么。
即使数据库中找到实体,我也尝试发送404错误,404错误页面也可以正常工作。
有人能向我解释一下JSF的这种行为吗?或者提供一些不改变URL的方式来显示404错误页面?
FacesContext.getCurrentInstance().responseComplete();
,但仍然无效。我认为这种行为是符合JSF生命周期的,但我无法理解它。 - Welyab Paula/faces/*
),并使用PrettyFaces将URL映射到.xhtml文件;除了报告的问题外,一切都正常。<br/><br/>即使没有PrettyFaces,这个问题也会发生。 - Welyab Paula