调用方法与EL可变参数抛出java.lang.IllegalArgumentException异常:

2019-05-12 06:14发布

我使用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)}

但它给了我一个:

重症[javax.enterprise.resource.webcontainer.jsf.context](HTTP-本地主机/ 127.0.0.1:8080-5)java.lang.IllegalArgumentException异常:错误数量的参数

有没有执行从EL这种方法的方法吗?

Answer 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', ','))}

但无论哪种方式,你仍然需要将其解析为整数,或者传入的整数转换为字符串。

如果你已经对EL 3.0,你也可以使用新的EL 3.0集合语法 ,而不需要对整个EL功能。

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


文章来源: Invoke method with varargs in EL throws java.lang.IllegalArgumentException: wrong number of arguments
标签: jsf-2 el