Jonathan S. Fisher created MYFACES-4440:
-------------------------------------------
Summary: MyFaces forces session creation when transient=true if
using ui:composition
Key: MYFACES-4440
URL: https://issues.apache.org/jira/browse/MYFACES-4440
Project: MyFaces Core
Issue Type: Bug
Affects Versions: 2.3.10
Reporter: Jonathan S. Fisher
Hello, we noticed a small bug with transient="true" on a f:view. Essentially,
if you use Facelets templating, you always get a session created.
Near the end of RenderResponseExecutor.execute(), it calls a private function
called forceSessionCreation(). This is done because if the view is
non-transient, you need to get the cookie header out the door before any
rendering is done that could possible using a viewScopedBean. Makes sense.
Here's the bug we noticed though, if the xhtml file uses ui:composition, the
transient flag is false at that point. This forces a sessionCreation even
though later the setTransient is set on the viewRoot. I'm probably not using
the correct terminology above, so an example is probably just a better way to
demonstrate the problem:
Lets say this is your index.xhtml:
{{<ui:composition}}
{{ xmlns="http://www.w3.org/1999/xhtml"}}
{{ xmlns:h="http://xmlns.jcp.org/jsf/html"}}
{{ xmlns:ui="http://xmlns.jcp.org/jsf/facelets"}}
{{ xmlns:mf="https://emoneyusa.com/magfaces/1.0/ui"}}
{{ template="/template.xhtml">}}
{{ <ui:define name="body">this creates a session</ui:define name="body">}}
{{</ui:composition>}}
and this is your template.xhtml
{{<html xmlns:f="http://xmlns.jcp.org/jsf/core">}}
{{ <f:view}}
{{ contentType="text/html"}}
{{ encoding="UTF-8"}}
{{ transient="true">}}
{{ <h:head><title>template title</title></h:head>}}
{{ <h:body>}}
{{ <ui:insert name="body"/>}}
{{ </h:body>}}
{{ </f:view>}}
{{</html>}}
Whats interesting is if you do not use Facelets Templates, everything works
just fine. My naive analysis thinks that when the VDL creates a UiViewRoot, the
transient flag is not set correctly at that point.
My team has pushed a few patches to MyFaces over the last year, and we're happy
to take a crack at this one too! For us, simply removing the check
context.getViewRoot().isTransient() in forceSessionCreation is sufficient to
solve the problem, but we know that pretty much nerfs that function of its
intended purpose. We love MyFaces and are happy to put in some sweat to fix
bugs like this that affect everyone. As such, we could use a bit of guidance on
the preferred fix. It seems setTransient() needs to be called much sooner, and
we're not sure how to accomplish that.
Thank you!
--
This message was sent by Atlassian Jira
(v8.20.10#820010)