Multiple actionlisteners in JSF

jsf, jsf-2, primefaces

Solution

I see you facilitate the traditional approach of guess-how-it-works-using-bare-intuition-and-random-associations-then-act-surprised :-)

`f:actionListener` only lets you add a whole object as an observer, not an arbitrary method. You can either use `type` attribute to specify the class name (it will be instantiated by JSF) or `binding` attribute to give an instance of the object that you created by yourself (not a method!). The object must implement `javax.faces.event.ActionListener`.

Your second try (`testDeviceGroupController.prepareCreate(event)`) is wrong on many levels, but the crux is that the methods are called not to handle your action, but to create the `Actionlistener` instance.

You have a couple of options:

- the sanest one: just make a method that calls each of the target methods. Since they are on different beans, you can inject one into the other.

- if that doesn't work for you, you can create a method that creates a listener object.

Like this:

public ActionListener createActionListener() {
    return new ActionListener() {
        @Override
        public void processAction(ActionEvent event) throws AbortProcessingException {
            System.out.println("here I have both the event object, and access to the enclosing bean");
        }
    };
}

and use it like this:

<h:commandButton>
    <f:actionListener binding="#{whateverBean.createActionListener()}"/>            
</h:commandButton>

Problem

I want to use multiple action listener to set state of two backing beans before further processing 1st way: ``` <p:commandButton process="@this" > <f:attribute name="key" value="#{node.getIdTestGroup()}" /> <f:actionListener binding="#{testController.nodeListener}" /> <f:actionListener binding="#{testDeviceGroupController.prepareCreate}" /> </p:commandButton> ``` It give an exception: WARNING: /testGroup/List.xhtml @26,88 binding="#{testController.nodeListener()}": Method nodeListener not found javax.el.ELException: /testGroup/List.xhtml @26,88 binding="#{testController.nodeListener()}": Method nodeListener not found 2nd way: ``` <p:commandButton process="@this" > <f:attribute name="key" value="#{node.getIdTestGroup()}" /> <f:actionListener binding="#{testController.nodeListener(event)}" /> <f:actionListener binding="#{testDeviceGroupController.prepareCreate(event)}" /> </p:commandButton> ``` Event is null on the nodeListener and prepareCreate methods How to do it correct?

Original source

Related problems