h:selectOneMenu 报Value is not valid错误

在维护JSF页面时遇到一个h:selectOneMenu报Value is not valid错误,原因是数据库中char(6)类型的code在显示时存在空格填充。当选中值与下拉列表Items中的值不完全匹配时,JSF验证失败。通过跟踪源码发现,h:selectOneMenu会验证所选值是否存在于Items中,如果不在则抛出错误。解决方案是对下拉列表框的值进行trim()处理,消除多余的空格,从而解决问题。
摘要由CSDN通过智能技术生成

         这两天在做之前写的公共构件的维护页面,其中遇到一个不少棘手的问题,其中有一个就是h:selectOneMenu 报Value is not valid错误。我当时是在父页面中定义了一个省和城市两个下拉列表做的级联,子页面同样也定义了省和城市两个级联下拉列表。父页面没问题,子页面在做选择省时,城市是不改变的,而且后台报省下拉列表Value is not valid。经过审核标签,修改id等方法都不能解决。最后,觉得跟踪到jsf源码中一看究竟,发现在UISelectOne的validateValue方法中add进的消息。仔细跟踪终于发现了错误,而且是一个让俺苦笑不得的错误。由于省和城市的在code在数据库中的类型为char(6),所以在不够6位的补空格。不知为什么在子页面中选中下拉列表的值比下拉列表Items中对应的值少个空格,所以在jsf生命周期中验证错误,而无法调用managed Bean。

        现在我们分析一下这个问题。前两篇中我们说到了jsf的生命周期,每次请求都是要先经过验证的,h:selectOneMenu的验证方法:

 static boolean matchValue(FacesContext ctx,
                              UIComponent component,
                              Object value,
                              Iterator items,
                              Converter converter) {

        while (items.hasNext()) {
            SelectItem item = (SelectItem) items.nex

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值