OmniFaces转换器异常排查:SelectItemsConverter/IndexConverter问题
问题分析与修复方案
核心问题:组件与绑定属性类型不匹配
p:selectOneListbox是单选组件,它绑定的属性必须是单个TheArchersCharacter对象,但你现在绑定的是List<TheArchersCharacter>——这是所有异常的根源:
- 用
SelectItemsConverter时,组件提交的是选中项的显示文本"George",而转换器默认会把这个值当作实体的主键数字来解析,直接触发NumberFormatException - 用
SelectItemsIndexConverter时,组件会把选中的单个TheArchersCharacter实例赋值给List类型的属性,类型不匹配自然抛出转换异常
数字格式异常的具体原因
SelectItemsConverter的正常逻辑是:
- 渲染页面时,把每个选项实体的主键(一般是数字类型)作为
value输出 - 提交请求时,拿到这个主键字符串转成数字,再从数据源里找到对应实体
但因为你绑定的是List,组件的渲染逻辑被打乱,实际提交的是选项的**显示标签("George")**而非主键值,转换器尝试把字符串转数字,就触发了异常。
正确配置方式
如果你要的是单选
把TheArchersEpisode里的属性改成单个TheArchersCharacter:
// 替换原来的List<TheArchersCharacter>属性 private TheArchersCharacter selectedCharacter; public TheArchersCharacter getSelectedCharacter() { return selectedCharacter; } public void setSelectedCharacter(TheArchersCharacter selectedCharacter) { this.selectedCharacter = selectedCharacter; }
页面绑定这个属性并使用SelectItemsConverter:
<p:selectOneListbox value="#{yourBean.episode.selectedCharacter}" converter="omnifaces.SelectItemsConverter"> <f:selectItems value="#{yourBean.allCharacters}" var="char" itemLabel="#{char.name}" itemValue="#{char}" /> </p:selectOneListbox>
如果你要的是多选
换成p:selectManyListbox组件,绑定List<TheArchersCharacter>并搭配SelectItemsConverter:
<p:selectManyListbox value="#{yourBean.episode.characters}" converter="omnifaces.SelectItemsConverter"> <f:selectItems value="#{yourBean.allCharacters}" var="char" itemLabel="#{char.name}" itemValue="#{char}" /> </p:selectManyListbox>
额外提醒
TheArchersCharacter必须正确实现equals()和hashCode()方法,否则OmniFaces的转换器无法正常匹配实体。
内容的提问来源于stack exchange,提问作者NOTiFY
相关产品推荐
相关产品推荐

