重写/ PrettyFaces带有参数导致IllegalStateException:在响应已提交后不能创建会话



我想在JSF 2.2应用程序中使用带有注释的url重写器,因此我开始使用Rewrite (PrettyFaces的后继版本)。

我的应用程序仍然只是一个你好世界运行在TomEE 7。x,我想这里没有特别的依赖关系。我运行没有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

时的堆栈跟踪

. lang。事件后不能创建会话已作出回应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,则没有问题,并且视图被很好地渲染。

我做错了什么?(我已经给出了prettyfaces的版本,我也可以给重写的@Join的版本,但我认为问题是在其他地方,因为错误是相同的…)

多亏了chkal,我发现了这个问题,这确实是viewId字段(或Rewrite版本中的to字段)中缺少根('/')。

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

最新更新