hi and thanks for the responses.
sure, the FacesContext is a per request object. but as you guys mentioned in a 
possible solution below, you can make 
FacesContext.getCurrentInstance().getExternalContext return the Servlet or 
Portlet Context even if there is no request (hey, they exists...). this allows 
the code to be portable across containers (portlet and servlet) cause now 
(after migrating to a ServletContext solution) i guess my code will only work 
for servlet containers.

also, i dont see any problems with implementing a managed bean creation 
facility in a way that will allow the application scope beans be initialized on 
startup (even if they use a property through a value binding exp. if the bean 
is in the app scope then the value binding exp it uses to initialize a propery 
must be in the app scope also anyway).
any thoughts?

-----Original Message-----
From: Craig McClanahan [mailto:[EMAIL PROTECTED]
Sent: Monday, August 29, 2005 1:02 AM
To: MyFaces Discussion
Subject: Re: managed beans creation facility question


On 8/28/05, ir. ing. Jan Dockx <[EMAIL PROTECTED]> wrote:
> Good point, I think, and no, I can't think of a rationale.
> 

The key issue is that expression evaluation occurs with respect to a
context ... specifically, the FacesContext for the current request,
which contains internal references to (in a webapp) a ServletContext,
a ServletRequest, and a ServletResponse.  There can't be such a "real"
object at application startup time, because there is no request in
place.

> You could work around the limitation by initializing the objects you
> need in a servlet context listener though, and store them in
> application scope yourself. You are not using the managed bean (~ IoC)
> mechanism then though.
> 
> If, however, you just access the VariableResolver in your context
> listener, the beans get initialized and get stored in the scope they
> are defined for.
> 

That won't necessarily be sufficient if your managed bean declaration
has managed properties that are also initialized via value binding
expressions.  The JSF framework will be applying its usual expression
evaluation facilities to that kind of an expression.

An alternative that might work, though, is to construct a mock
ExternalContext with only the ServletContext object, and no request
and response, and then construct a mock FacesContext wrapping that. 
You should be able to evaluate expressions that don't attempt to
access things from request or session scope.

Craig

Reply via email to