使用JSF 2.0中的变量参数调用方法

时间:2012-03-28 16:54:44

标签: jsf variadic-functions

在支持bean中,我声明了以下方法

public boolean hasPermission(Object... objects) {
...
}

我正试图从JSF 2.0中调用它,如下所示:

<c:set var="hasPermission" scope="view" value="#{restrictions.hasPermission(entity)}" />

它抛出

javax.el.ELException:  Cannot convert Entity of class com.testing.Entity to class [Ljava.lang.Object;

如果我传递两个参数,则抛出

Method hasPermission not found

我可以以某种方式从JSF 2.0中调用varargs方法吗?

2 个答案:

答案 0 :(得分:2)

EL中没有正式支持Varargs。至少,它在EL specification.中没有指定。似乎也没有任何计划在即将到来的EL 3.0中引入它。

您需要寻找不同的解决方案。由于功能要求不清楚,我无法提出任何建议。


更新似乎Tomcat中提供的Apache EL解析器支持此功能。它至少不受Glassfish提供的Sun / Oracle EL解析器的支持。

答案 1 :(得分:2)

关于Tomcat 7 JSF 2.1.4的工作

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:f="http://java.sun.com/jsf/core">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Insert title here</title>
</head>
<body>
<h:form>
    <h:commandButton value="click 1"
        action="#{test.var('a','b',1,test.i,test.d,test.s,test.ss)}"/>
    <h:commandButton value="click 2"
        action="#{test.var('a','b',1)}"/>
    <h:commandButton value="click 3"
        action="#{test.var(test.i,test.d,test.s,test.ss)}"/>
</h:form>
</body>
</html>

The Bean:

@ManagedBean
public class Test {

    private Integer i = 10;
    private Double d = 10.0;
    private String s = "varargs";
    private String[] ss = new String[]{"1","2","3"};
    public Integer getI() {
        return i;
    }
    public void setI(Integer i) {
        this.i = i;
    }
    public Double getD() {
        return d;
    }
    public void setD(Double d) {
        this.d = d;
    }
    public String getS() {
        return s;
    }
    public void setS(String s) {
        this.s = s;
    }
    public String[] getSs() {
        return ss;
    }
    public void setSs(String[] ss) {
        this.ss = ss;
    }

    public void var(Object...objects){
        System.out.println(Arrays.toString(objects));
    }
}

输出:点击1,2,3

  

[a,b,1,10,10.0,varargs,[Ljava.lang.String; @ 4fa9cba5]

     

[a,b,1]

     

[10,10.0,varargs,[Ljava.lang.String; @ 26b923ee]

这就是你要找的......因为你试图打电话的方式是空白的。