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