Jsf h:SelectOne菜单绑定到int错误“;验证错误:值无效";

Jsf h:SelectOne菜单绑定到int错误“;验证错误:值无效";,jsf,integer,selectonemenu,jsf-1.1,Jsf,Integer,Selectonemenu,Jsf 1.1,我被JSF RI 1.1_02困住了,看到了这个问题 以下是我期待的Facelet代码: <h:form> <h:selectOneMenu value="#{bean.num}" converter="javax.faces.Integer"> <f:selectItem itemLabel="one" itemValue="1" /> <f:selectItem itemLabel="two" item

我被JSF RI 1.1_02困住了,看到了这个问题

以下是我期待的Facelet代码:

<h:form>
    <h:selectOneMenu value="#{bean.num}" converter="javax.faces.Integer">
        <f:selectItem itemLabel="one"   itemValue="1" />
        <f:selectItem itemLabel="two"   itemValue="2" />
        <f:selectItem itemLabel="three" itemValue="3" />
    </h:selectOneMenu>
    <h:commandButton value="submit" />
    <h:messages />
</h:form>
当我写了这么少不需要任何转换器的代码时,我正在接收并且无法想象我已经做错了什么。我是否遗漏了一些明显的东西,或者这是JSFRI1.102中的一个bug


我可以通过简单地将支持bean中的属性类型更改为
String
来解决这个问题,但是当(自动)转换应该在那里时,我不得不这样做,这让我很沮丧。

我花时间创建了一个JSF RI 1.1_02游乐场环境,并且我能够重现您的问题。检查源代码后,罪魁祸首似乎认为
值从未转换为与提交值相同的类型。因此,它基本上是将项目值作为
String
与提交的值作为
Integer
进行比较,这个比较永远不会返回
true

这是一个相当棘手的错误,从技术上讲,只能通过替换
UISelectOne
组件来解决(顺便说一句,
UISelectMany
暴露了相同的错误)。问题出在private
matchValue()
方法中。自定义转换器(我最初想到的解决方案)不会有任何帮助,因为它根本不会为
值调用

升级到立即修复了该问题


更新:如果您确实无法升级,我发现了一种利用EL强制的解决方法:如果您引用EL中的值而不是静态字符串,那么它们将被隐式视为
。如果将属性类型从
Integer
更改为
Long
,则它将在没有任何转换器的情况下工作

<h:selectOneMenu value="#{bean.num}">
    <f:selectItem itemLabel="one"   itemValue="#{1}" />
    <f:selectItem itemLabel="two"   itemValue="#{2}" />
    <f:selectItem itemLabel="three" itemValue="#{3}" />
</h:selectOneMenu>

只是想知道,为什么仍然是JSF1.1?它在6.5年前被JSF1.2所取代,而在2.5年前又被JSF2.0所取代。请注意,与JSF 1.1兼容的环境在理论上也应该支持JSF 1.2,而不会有太多麻烦。大型船舶不容易转向,也就是说,现在迁移的成本太高了……我想这是大型企业在重大变更控制方面的权衡。然而,我很惊讶地看到您正在使用Facelets。这是5.5年前(在JSF1.2期间)引入的。从JSF1.1而不是1.2开始是没有意义的。将JSP迁移到Facelets比将JSF 1.1迁移到1.2更难。@billy您的公司可能已经用FoxPro编写了应用程序,因为JSF 1.1是一个令人憎恶的东西。我们的架构办公室将设计从象牙塔上扔下来的无限智慧。@Daniel:是bug还是我的努力?这只虫子确实让我说不出话来。这让我想起了JSF在早期是如何被憎恨的以及为什么被憎恨的。你的努力,发现了这个bug(看起来很难以捉摸):“同意,@BalusC你真的是一个杰出的贡献者,谢谢你花时间@BalusC,我也很好奇,我一直在到处寻找源代码,只找到一个位置有impl的源代码,但它没有在调试模式下排列,所以我认为它不是同一个版本。您介意分享一下1.1_02的impl来源吗?如果这更合适的话,我很乐意为这个问题单独提出一个问题。
<h:selectOneMenu value="#{bean.num}">
    <f:selectItem itemLabel="one"   itemValue="#{1}" />
    <f:selectItem itemLabel="two"   itemValue="#{2}" />
    <f:selectItem itemLabel="three" itemValue="#{3}" />
</h:selectOneMenu>
private Long num;