我正在使用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执行这样的方法?
答案 0 :(得分:16)
不,在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 collection syntax而不需要整个EL功能。
#{[2,3,5].contains(OtherBean.category.id)}