【问题标题】:Rewrite / PrettyFaces with parameter causes IllegalStateException: Cannot create a session after the response has been committed带参数的 Rewrite / PrettyFaces 导致 IllegalStateException:在提交响应后无法创建会话
【发布时间】:2017-03-06 18:19:53
【问题描述】:

我想在我的 JSF 2.2 应用程序中使用一些带有注释的 url 重写器,所以我开始尝试使用 RewritePrettyFaces 后继者)。

我的应用程序仍然只是在TomEE 7.x 中运行的一个hello world,我猜这里没有花哨的依赖项。我运行时没有web.xml,空faces-config.xml 和空beans.xml

我创建了一个新的专用支持 bean 和 xhtml 来测试 Rewrite,问题是每当我在 Url 中添加参数时,我都会得到一个 IllegalStateException响应后无法创建会话已提交

我尝试降级到PrettyFaces 3.3.3,但出现完全相同的错误。

这是Backing Bean的代码

@Named
@javax.enterprise.context.RequestScoped
@URLMapping(id = "testroot", pattern = "/testRoot/#{testRootView.bar}", viewId = "xyz/TestRoot.jsf")
public class TestRootView implements Serializable {

    String foo = "my first String";

    String bar ="";

    // getters and setters ...
}

还有风景

<?xml version="1.0" encoding="UTF-8"?>
<body jsf:id="root-body" xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://xmlns.jcp.org/jsf/html"
      xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
      xmlns:f="http://xmlns.jcp.org/jsf/core"
      xmlns:jsf="http://xmlns.jcp.org/jsf">

<p>
This is my string : #{testRootView.foo}
</p>

<p>
And this is another string : #{testRootView.bar}
</p>

</body>

以及访问http://localhost:8080/testRoot/aaa时的堆栈跟踪

java.lang.IllegalStateException: 之后无法创建会话 已提交响应 org.apache.catalina.connector.Request.doGetSession(Request.java:2952) org.apache.catalina.connector.Request.getSession(Request.java:2361) org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:896) javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231) javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:231) org.apache.myfaces.context.servlet.SessionMap.setAttribute(SessionMap.java:56) org.apache.myfaces.util.AbstractThreadSafeAttributeMap.put(AbstractThreadSafeAttributeMap.java:109) org.apache.myfaces.util.AbstractThreadSafeAttributeMap.put(AbstractThreadSafeAttributeMap.java:38) org.apache.myfaces.application.viewstate.ServerSideStateCacheImpl.saveSerializedViewInServletSession(ServerSideStateCacheImpl.java:250) org.apache.myfaces.application.viewstate.ServerSideStateCacheImpl.saveSerializedView(ServerSideStateCacheImpl.java:642) org.apache.myfaces.renderkit.html.HtmlResponseStateManager.saveState(HtmlResponseStateManager.java:138) org.apache.myfaces.application.StateManagerImpl.saveView(StateManagerImpl.java:279) org.apache.myfaces.shared.view.JspViewDeclarationLanguageBase.renderView(JspViewDeclarationLanguageBase.java:220) org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:313) com.ocpsoft.pretty.faces.application.PrettyViewHandler.renderView(PrettyViewHandler.java:163) javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:58) javax.faces.application.ViewHandlerWrapper.renderView(ViewHandlerWrapper.java:58) org.omnifaces.viewhandler.OmniViewHandler.renderView(OmniViewHandler.java:115) org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116) org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:267) javax.faces.webapp.FacesServlet.service(FacesServlet.java:200) org.apache.tomee.myfaces.TomEEWorkaroundFacesServlet.service(TomEEWorkaroundFacesServlet.java:47) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:145) com.ocpsoft.pretty.PrettyFilter.doFilter(PrettyFilter.java:137)

请注意,如果我从模式 (pattern = "/testRoot") 中删除参数并访问http://localhost:8080/testRoot,则没有问题,并且视图呈现良好。

我做错了什么? (我给出了带有漂亮面孔的版本,我也可以给出带有 Rewrite 的@Join 的版本,但我认为问题出在其他地方,因为错误是相同的......)

【问题讨论】:

  • 您能否再次检查viewId 属性是否正确?您还应该使用绝对 viewId(如 /xyz/TestRoot.jsf)。您还可以尝试通过附加斜线 (/testRoot/#{testRootView.bar}/) 来更改模式,因为某些包含在某些极端情况下会出现非常奇怪的行为。

标签: jsf prettyfaces ocpsoft-rewrite


【解决方案1】:

感谢chkal,我找到了问题,确实是viewId字段(或Rewrite版本中的to字段)中缺少root('/')。

添加它解决了这个问题。我仍然想知道我的代码将在哪里搜索一个会话,如果它找到了它会做什么:)

【讨论】:

  • 我猜“会话问题”实际上是由 Rewrite 将请求转发到无效路径这一事实引起的。可能是在某处未正确处理失败的转发。 :-)
猜你喜欢
  • 2013-06-19
  • 2011-12-25
  • 2011-01-04
  • 2012-06-12
  • 2012-06-06
  • 2013-05-29
相关资源
最近更新 更多