在我的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)}”。
答案 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}"/>