【问题标题】:h:selectOneMenu bound to int incorrectly errors "Validation error: Value is not valid"h:selectOneMenu 绑定到 int 错误“验证错误:值无效”
【发布时间】:2012-07-28 09:21:49
【问题描述】:

我坚持使用 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>

请求范围的bean:

public class Bean {
    private int num;

    public void setNum(Integer aNum) {
        num = aNum;
    }

    public Integer getNum() {
        return num;
    }
}

我收到了Validation Error: Value is not valid,当我编写了这么少不需要任何转换器的代码时,我已经无法想象我做错了什么。我是否遗漏了一些明显的东西,或者这是 JSF RI 1.1_02 中的错误?

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

【问题讨论】:

  • 只是想知道,为什么还是 JSF 1.1?它在 6.5 年前被 JSF 1.2 取代,而在 2.5 年前又被 JSF 2.0 取代。请注意,JSF 1.1 兼容环境理论上也应该支持 JSF 1.2,而不会有任何麻烦。
  • 大船不容易转弯,也就是说,现在迁移的成本太高了……我想这是大型企业对大量变更控制的权衡。
  • 我很惊讶看到您使用的是 Facelets。这是 5.5 年前引入的(在 JSF 1.2 时期)。从 JSF 1.1 而不是 1.2 开始是没有意义的。将 JSP 迁移到 Facelets 比将 JSF 1.1 迁移到 1.2 更难。
  • @billy 您的公司还不如在 FoxPro 中编写应用程序,因为 JSF 1.1 令人讨厌。
  • 我们建筑事务所的无限智慧将设计从象牙塔中扔下。

标签: jsf integer selectonemenu jsf-1.1


【解决方案1】:

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

这是一个非常尴尬的错误,在技术上只能通过替换 UISelectOne 组件来解决(顺便说一下,UISelectMany 暴露了相同的错误)。问题出在私有matchValue() 方法中。自定义转换器(我最初想到的一个解决方案)不会有任何帮助,因为它根本不会为 &lt;f:selectItem&gt; 值调用。

升级到Mojarra 1.2_15 立即解决了问题。


更新:如果您真的,真的无法升级,我找到了一个利用 EL 强制的解决方法:如果您引用 EL 中的值而不是静态值字符串,然后它们被隐式视为Long。如果您将属性类型从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>

private Long num;

【讨论】:

  • @Daniel:错误还是我的努力?这个错误确实让我无语。让我想起了 JSF 在早年是如何以及为什么被讨厌的。
  • 你的努力,发现了这个错误(这似乎很难):)
  • 同意,@BalusC 你真的是一位杰出的贡献者,感谢您抽出宝贵的时间!
  • @BalusC,我也很好奇,我一直在到处寻找源代码,只找到一个包含 impl 源代码的位置,但它没有在调试模式下排队,所以我不认为这是相同的构建。你介意分享你从哪里得到 1.1_02 的 impl 源吗?如果更合适的话,我很乐意为此创建一个单独的问题。
猜你喜欢
  • 1970-01-01
  • 2015-11-03
相关资源
最近更新 更多