我正在将JSF从1.2升级到2.2版本。
我的支持bean方法中有一个简单的response.sendRedirect()。使用JSF2.2,它开始提供“java.lang.IllegalStateException:在org.apache.catalina.connecto上写入数据之后无法更改缓冲区大小”异常。
添加“FacesContext.getCurrentInstance()。responseComplete();”后,它有效!
任何人都可以帮助我理解如何在JSF2.2中升级实现,重定向无法明确表示响应已完成吗?
谢谢!
答案 0 :(得分:4)
你应该使用ExternalContext#redirect()
来完成这项工作。
public void submit() throws IOException {
// ...
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.redirect(ec.getRequestContextPath() + "/otherpage.jsf");
}
从一开始就是这种情况,也是在JSF 1.x中。在执行FacesContext#responseComplete()
后,它会自动调用HttpServletResponse#sendRedirect()
。 responseComplete()
基本上会指示JSF已经手动完成了响应,并且JSF基本上不需要继续呈现响应阶段(即将导航结果写入响应)。
此外,任何试图从JSF的封面下获取和转发原始javax.servlet.*
API的尝试都应该作为一个提示,如果还没有JSF-ish方法来实现同样的话,请三思而后行。在JSF 2.x中,还有一种执行重定向的新方法:将faces-redirect=true
查询参数附加到(隐式)导航结果:
public String submit() {
// ...
return "otherpage?faces-redirect=true";
}
对于您所面临的非法状态异常,JSF 2.2只是将响应标头设置为实际需要呈现响应的时间点。如果响应已经提交,那就太晚了。
答案 1 :(得分:-2)
Java.lang.IllegalStateException:在org.apache.catalina.connecto“exception”写入数据后无法更改缓冲区大小。
这可能是因为您手动设置了响应缓冲区大小以减少渲染时的内存重新分配,但页面的大小超过缓冲区大小
例如
invForeignKeyNames