当ID无效时,我尝试引发404错误,因此我使用了以下方法:How to throw 404 from bean in jsf使用ExternalContext#dispatch()。
此刻我的initialize()
无效作品:
@PostConstruct
public void initialize() {
data = service.select(id.getValue());
if (data == null) {
try {
FacesContext context = FacesContext.getCurrentInstance();
ExternalContext externalContext = context.getExternalContext();
externalContext.setResponseStatus(HttpServletResponse.SC_NOT_FOUND);
externalContext.dispatch("/404.xhtml");
context.responseComplete();
} catch (FacesException | IOException ex) {
}
}
}
但是它会在以下情况下生成NullPointerException
:
org.apache.catalina.core.StandardWrapperValve.invoke路径为[]的Servlet [Faces Servlet]的Servlet.service()引发异常[过滤的请求失败。]根本原因 java.lang.NullPointerException
指向的位置(请参见注释行):
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response); // <-- NullPointerException
}
// [...]
}
我认为这与以下问题有关:NullpointerException in getExternalContext in FacesContext,而BalusC的答案很有意义:
永远不要使用
ExternalContext#dispatch()
。此方法没有单一 体面的JSF Web应用程序中的合理用例。它只会腐败 JSF生命周期,因为它会在JSF生命周期内创建另一个FacesContext
当前请求。
但是如何在不抛出NullPointerException
的情况下获得相同的结果?