Metodo di richiamo con varargs in EL genera java.lang.IllegalArgumentException: numero di argomenti errato

Sto usando JSF 2.

Ho un metodo che controlla la corrispondenza dei valori da un elenco di valori:

@ManagedBean(name="webUtilMB") @ApplicationScoped public class WebUtilManagedBean implements Serializable{ ... public static boolean isValueIn(Integer value, Integer ... options){ if(value != null){ for(Integer option: options){ if(option.equals(value)){ return true; } } } return false; } ... } 

Per chiamare questo metodo in EL ho provato:

 #{webUtilMB.isValueIn(OtherBean.category.id, 2,3,5)} 

Ma mi ha dato un:

SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-localhost / 127.0.0.1: 8080-5) java.lang.IllegalArgumentException: numero di argomenti errato

C’è un modo per eseguire un tale metodo da EL?

No, non è ansible utilizzare argomenti variabili nelle espressioni del metodo EL, per non parlare delle funzioni EL.

La soluzione migliore è creare più metodi denominati diversi con una quantità diversa di argomenti fissi.

 public static boolean isValueIn2(Integer value, Integer option1, Integer option2) {} public static boolean isValueIn3(Integer value, Integer option1, Integer option2, Integer option3) {} public static boolean isValueIn4(Integer value, Integer option1, Integer option2, Integer option3, Integer option4) {} // ... 

Come alternativa dubbia, potresti passare una stringa separata e dividerla all’interno del metodo

 #{webUtilMB.isValueIn(OtherBean.category.id, '2,3,5')} 

o anche un array di stringhe creato da fn:split() su una stringa separata

 #{webUtilMB.isValueIn(OtherBean.category.id, fn:split('2,3,5', ','))} 

ma in entrambi i casi, avresti ancora bisogno di analizzarli come numero intero o di convertire il numero intero passato in stringa.

Se sei già su EL 3.0, puoi anche utilizzare la nuova syntax della collezione EL 3.0 senza la necessità dell’intera funzione EL.

 #{[2,3,5].contains(OtherBean.category.id)}