使用参数重写/ PrettyFaces会导致IllegalStateException:在提交响应后无法创建会话

时间:2016-10-24 20:58:49

标签: jsf prettyfaces ocpsoft-rewrite

我想在我的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则没有问题,并且视图渲染得很好。

我做错了什么? (我已经给出了带有prettyfaces的版本,我也可以给一个带有Rewrite&{39} @Join的版本,但我认为问题出在其他地方,因为错误是相同的......)

1 个答案:

答案 0 :(得分:0)

感谢chkal,我发现了问题,确实viewId字段(或to字段中缺少root('/')版本)。

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