28

The conditional operator works in many attributes like "rendered" "value" and others.

But it does not work in action? Or am I doing it wrong?

<h:commandLink action="#{true ? bean.methodTrue() : bean.methodFalse()}"/>

Error: javax.el.ELException: Not a Valid Method Expression

(I realized it using primefaces ajax action attribute)

BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
djmj
  • 5,579
  • 5
  • 54
  • 92
  • 1
    According to this, it is not possible [EL conditional Method Expression](http://stackoverflow.com/questions/5433876/el-conditional-method-expression) – Fallup May 06 '12 at 22:14
  • thanks, hope this gets resolved in future updates – djmj May 06 '12 at 23:26

1 Answers1

53

This is not supported. The action attribute is supposed to be a MethodExpression, but the conditional operator makes it a ValueExpression syntax. I don't think this will ever be supported for MethodExpressions in EL.

You have basically 2 options:

  1. Create a single action method which delegates the job.

    <h:commandButton ... action="#{bean.method}" />
    

    with

    public String method() {
        return condition ? methodTrue() : methodFalse();
    }
    

    If necessary, pass it in as method argument by #{bean.method(condition)}.

  2. Or, conditionally render 2 buttons.

    <h:commandButton ... action="#{bean.methodTrue}" rendered="#{bean.condition}" />
    <h:commandButton ... action="#{bean.methodFalse}" rendered="#{not bean.conditon}" />
    
BalusC
  • 1,082,665
  • 372
  • 3,610
  • 3,555
  • 1
    @Alex: the way which fits your model the best. The second way has however the additional requirement that the condition must be preserved in the request, which is best to be achieved by placing bean in view scope, othwewise you'll stumble upon the problem described as #5 in http://stackoverflow.com/questions/2118656/commandlink-commandbutton-ajax-backing-bean-action-listener-method-not-invoked – BalusC Mar 12 '15 at 13:05
  • @BalusC view scope is just fine for my requirement and it works perfectly. Thank you again. For further times: Alexander is just fine (Don't know, but hate Alex for me). :) – alexander Mar 12 '15 at 13:32
  • Would the same apply to an outputLink? – Michael Miner Jun 01 '15 at 14:08
  • @MichaelMiner: output link doesn't have any method expression attribute in first place. – BalusC Jun 01 '15 at 16:53
  • 2nd Option is the best! – TiyebM Jan 07 '19 at 22:27