升级到JSF2(可能)后,.xhtml
文件中的一个特殊访问者会生成IllegalArgumentExceptions
,但我无法找到原因。在我的本地JBoss(4.2.2)上运行应用程序不会产生此异常,但这可能与调试和实时数据之间的差异有关。
生成以下堆栈跟踪,我可以从生产服务器日志中提取:
Caused by: javax.el.ELException: /xy/xy-subtemplate1.xhtml @131,45 value="#{someClass.someProperty}": java.lang.IllegalArgumentException
at com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:101)
at javax.faces.component.UIInput.updateModel(UIInput.java:818)
... 36 more
Caused by: java.lang.IllegalArgumentException
at sun.reflect.GeneratedMethodAccessor1134.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javax.el.BeanELResolver.setValue(BeanELResolver.java:108)
at com.sun.faces.el.DemuxCompositeELResolver._setValue(DemuxCompositeELResolver.java:255)
at com.sun.faces.el.DemuxCompositeELResolver.setValue(DemuxCompositeELResolver.java:281)
at org.apache.el.parser.AstValue.setValue(AstValue.java:114)
at org.apache.el.ValueExpressionImpl.setValue(ValueExpressionImpl.java:249)
at com.sun.facelets.el.TagValueExpression.setValue(TagValueExpression.java:93)
... 37 more
someClass
正在列表中进行迭代,并具有以下方法来访问someProperty
:
public int getSomeProperty() {
return this.getSomeRelatedEnum().ordinal();
}
public void setSomeProperty( final int index) {
this.setSomeRelatedEnum( SomeRelatedEnum.fromOrdinal( index) );
}
这怎么会导致上面提到的IllegalArgumentException
?
答案 0 :(得分:1)
当setter方法毕竟需要与EL提供的参数类型不同的参数类型时,就会发生这种情况。
我猜测它与EL中的硬编码/未转换数字默认被视为long
而不是int
这一事实有关。尝试将int
更改为long
,或在输入组件上提供显式整数转换器,如<h:someInput converter="javax.faces.Integer">
。
顺便问一下,为什么不直接获取/设置枚举?通过序数获取/设置枚举是非常糟糕的。