代码之家  ›  专栏  ›  技术社区  ›  Sebastian Wramba

升级到JSF2后,自定义setter中出现IllegalArgument异常

  •  1
  • Sebastian Wramba  · 技术社区  · 12 年前

    在升级到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 上面提到的?

    1 回复  |  直到 12 年前
        1
  •  1
  •   BalusC    12 年前

    当setter方法毕竟需要与EL on提供的参数类型不同的参数类型时,就会发生这种情况。

    猜测 这与EL中的硬编码/未转换数字默认情况下被视为 long 而不是 int 。请尝试更改 整数 将来 长的 ,或者像这样在输入组件上提供显式整数转换器 <h:someInput converter="javax.faces.Integer">

    顺便说一下,为什么不直接获取/设置枚举本身呢?按序号获取/设置枚举是不正常的。