2013-03-22 8 views
6

Używam JSF 2.metoda Invoke z varargs w El rzuca java.lang.IllegalArgumentException: zła ilość argumentów

mam metodę, która sprawdza dopasowanie wartości z listy wartości:

@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; 
} 


... 
} 

Aby wywołać tę metodę w EL próbowałem:

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

Ale to dało mi:

POWAŻNE [javax.enterprise.resource.webcontainer.jsf.context] (http-localhost/127.0.0.1: 8080-5) java.lang.IllegalArgumentException: zła ilość argumentów

Czy istnieje sposób, aby wykonać taką metodę z EL?

Odpowiedz

15

Nie, nie można używać zmiennych argumentów w wyrażeniach metod EL, nie mówiąc już o funkcjach EL.

Najlepiej jest utworzyć wiele różnych nazwanych metod z inną ilością ustalonych argumentów.

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) {} 
// ... 

Jako wątpliwej Alternatywnie, można zdać commaseparated ciąg i podzielić ją wewnątrz metody

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

czy nawet tablicy ciągów, który jest tworzony przez fn:split() na commaseparated ciąg

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

ale tak czy inaczej, nadal trzeba przeanalizować je jako liczbę całkowitą lub przekonwertować liczbę całkowitą przekazywaną na ciąg.

Jeśli jesteś już na EL 3.0, możesz również użyć nowego EL 3.0 collection syntax bez potrzeby korzystania z całej funkcji EL.

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