You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@myfaces.apache.org by Francisco Passos <fr...@gmail.com> on 2007/04/30 18:56:20 UTC
Accessing registered beans
Hello there.
I'd like to know if there's a way to get a list of the names of the managed
beans that are declared in faces-config.xml. I'm trying to get my beans to
implement an interface and call specific methods upon a particular phase.
However, even if I implement a PhaseListener, I still have to do something
like this:
MyBean1 bean = (MyBean1) FacesContext.getCurrentInstance
().getApplication().getVariableResolver().resolveVariable(
FacesContext.getCurrentInstance (), "myBean1");
bean.callDesiredMethod();
Only I'd like to do this for any of my beans in the scope... is this
possible?
Re: Accessing registered beans
Posted by Simon Kitching <si...@rhe.co.nz>.
Francisco Passos wrote:
> Hello there.
>
> I'd like to know if there's a way to get a list of the names of the
> managed beans that are declared in faces-config.xml. I'm trying to get
> my beans to implement an interface and call specific methods upon a
> particular phase.
>
> However, even if I implement a PhaseListener, I still have to do
> something like this:
>
> MyBean1 bean = (MyBean1)
> FacesContext.getCurrentInstance().getApplication().getVariableResolver().resolveVariable(FacesContext.getCurrentInstance
> (), "myBean1");
>
> bean.callDesiredMethod();
>
> Only I'd like to do this for any of my beans in the scope... is this
> possible?
I don't know of any easy way to access the list of declared managed
beans. There certainly isn't a portable way to do this. One possible
solution would be to register your own VariableResolver (there is a
standard way to do this) and have that simply call the normal
VariableResolver then cache the result somewhere you can access. This
isn't quite the same, but close.
It *is* trivial to get a list of all the objects in the
request/session/application scopes using the standard Servlet API. Is
this not sufficient?
Note that the resolveVariable method does the following:
(1) look in request scope for the specified name
(2) look in session scope
(3) look in application scope
(4) look for a managed bean with that name, and if found create an
instance and add it to the appropriate scope.
Steps 1-3 are easy to implement yourself. Actually, you probably don't
want (3) anyway as the PhaseListener executes for each request.
Do you really want step 4 to happen, ie to force every declared managed
bean to be created? Normally managed beans are created only when
actually referenced (see 4 above).
See class org.apache.myfaces.el.VariableResolverImpl in the myfaces
source for the full details; it isn't too complicated.
Regards,
Simon