Вызывать метод с varargs в EL throws java.lang.IllegalArgumentException: неправильное количество аргументов

Я использую JSF 2.

У меня есть метод, который проверяет соответствие значений из списка значений:

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


...
}

Чтобы вызвать этот метод в EL, я попытался:

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

Но это дало мне:

SEVERE [javax.enterprise.resource.webcontainer.jsf.context] (http-localhost/127.0.0.1: 8080-5) java.lang.IllegalArgumentException: неправильное количество аргументов

Есть ли способ выполнить такой метод из EL?

Ответы

Ответ 1

Нет, невозможно использовать переменные аргументы в выражениях EL-метода, не говоря уже о функциях EL.

Лучше всего создать несколько разных именованных методов с различным количеством фиксированных аргументов.

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

Как сомнительная альтернатива, вы можете передать разделимую строку и разбить ее внутри метода

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

или даже строковый массив, созданный fn:split() в разделимой строке

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

но в любом случае вам все равно нужно проанализировать их как integer или преобразовать целое число переданных в строку.

Если вы уже находитесь на EL 3.0, вы также можете использовать новый синтаксис коллекции EL 3.0, не требуя всей функции EL.

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