1

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

小面模板:

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

java二传手:

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)}" 使用自定义函数。

4

2 回答 2

0

怎么用fmt:formatNumber

<fmt:formatNumber var="i" type="number" value="3" />
<c:set target="#{mybean}" property="size" value="${i}"/>
于 2013-09-12T17:07:40.283 回答
0

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

public class IndexBean {
    private int value;

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

    public int getValue() {
        return value;
    }
}

然后,当我在属性中使用延迟表达式(以 a 开头的表达式#)时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}"/>

...并且该值已正确显示在屏幕上。

于 2013-09-11T09:34:10.610 回答