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

Reply via email to