2012-03-28 101 views
3

可变参数在后台bean的方法调用我声明如下方法与JSF 2.0

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调用可变参数方法吗?

回答

2

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

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


更新似乎是在Tomcat中提供了Apache EL解析器支持这一点。它至少不受Glassfish中提供的Sun/Oracle EL分析器的支持。

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> 

豆:

@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,可变参数,[Ljava.lang.String; @ 4fa9cba5]

[a,b,1]

[10,10.0,可变参数,[Ljava.lang.String; @ 26b923ee]

这是你在找什么....当你试图在问题调用方式是空白。

+1

有趣。这必须是Tomcat特有的。它在Glassfish中失败。在EL规范中至少没有规定必须支持可变参数。 – BalusC 2012-03-28 19:43:00

+0

@BalusC不是活跃的glassfish用户,但很高兴知道它在glassfish中的支持。 – 2012-03-28 20:12:04

+0

您还可以检查: http://juel.sourceforge.net/ – ahmet 2013-06-13 14:03:21