有没有办法使用c:set设置非字符串bean属性?

时间:2013-09-11 07:58:34

标签: jsf facelets el

在我的JSF 2.1 facelets环境中,我想设置一个int类型的bean属性:

facelets模板:

<c:set target="#{mybean}" property="size" value="3"/>

java setter:

public void setSize(int size){
  this.size = size;
}

但它引发了一个例外:

javax.el.ELException: Can't set property 'size' on class 'MyBean' to value '3'.
    at javax.el.BeanELResolver.setValue(BeanELResolver.java:398)
    ...
Caused by: java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    ...

查看BeanELResolver的代码,我注意到值“3”遗憾地简单地传递给setter方法而没有任何强制,这显然不起作用。遗憾的是,BeanELResolver没有利用它所拥有的类型知识。

有没有办法以某种方式将值强制转换为int?我已经尝试过value =“#{3}”,但这会产生一个Long。接下来我想到的是使用自定义函数的value =“#{f:toInt(3)}”。

2 个答案:

答案 0 :(得分:0)

我试图重现你遇到的问题。我创建了一个带有单个属性的简单RequestScoped bean。

public class IndexBean {
    private int value;

    public void setValue(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

然后当我在#属性中使用了一个deferred表达式(以target开头的那个)...

<c:set target="#{indexBean}" property="value" value="5"/>
<h:outputText value="#{indexBean.value}"/>

...我收到一个JSP异常,说

  

为动态属性指定延迟表达式是非法的。

...这导致我将表达式更改为立即评估。

<c:set target="${indexBean}" property="value" value="5"/>
<h:outputText value="#{indexBean.value}"/>

...并且屏幕上的值正确显示。

答案 1 :(得分:0)

如何使用fmt:formatNumber

<fmt:formatNumber var="i" type="number" value="3" />
<c:set target="#{mybean}" property="size" value="${i}"/>