You need to enable JavaScript to run this app. ui:repeat内p:selectOneMenu的f:selectItem如何传参获取值
优惠活动
大模型
产品
解决方案
定价
更多

ui:repeat内p:selectOneMenu的f:selectItem如何传参获取值

问题原因

你遇到的报错是EL表达式的默认解析规则导致的:

  • 写法 #{relationshipController.proceduresPerformedInAProcedureRoom} 会被EL识别为读取Bean属性,会自动尝试调用无参的getProceduresPerformedInAProcedureRoom()方法,而你的后端方法是需要传入参数的有参方法,自然找不到对应属性抛出异常。
  • <f:param> 标签仅适用于命令组件、AJAX请求等场景,放在<f:selectItems>标签内无法为值表达式传递参数,属于无效写法。
解决方案(主流JSF 2.0+ 兼容,依赖EL 2.2+ ,当前绝大多数应用服务器均默认支持)

直接在EL表达式的方法调用中传入参数,删除无效的<f:param>标签即可。

1. 修改JSF文件中第二个下拉的代码

<p:selectOneMenu id="prM" value="#{ii.addingItem.ci.itemValue}" >
    <f:selectItem itemLabel="Please select" />
    <!-- 直接在方法括号中传入需要的参数 -->
    <f:selectItems value="#{relationshipController.proceduresPerformedInAProcedureRoom(ii.ci.institutionValue)}" 
                   var="li"
                   itemLabel="#{li.displayName}" 
                   itemValue="#{li}">
    </f:selectItems>
</p:selectOneMenu>

2. 修正Controller中的笔误

你原有Controller代码中,方法形参名为procedureRoom,但查询时使用了未定义的institution变量,需要修正:

public List<Item> proceduresPerformedInAProcedureRoom(Institution procedureRoom){
    // 把第一个参数改成你传入的procedureRoom
    List<Relationship> rs = findRelationships(procedureRoom, RelationshipType.Procedure_for_institution);
    List<Item> ps = new ArrayList<>();
    for(Relationship r:rs){
        ps.add(r.getItem());
    }
    return ps;
}
额外注意事项

因为你是在ui:repeat组件中使用该逻辑,只要第一个下拉的AJAX触发时ii变量作用域正常,第二个下拉的选项会随着你选择的手术室自动更新,符合你的动态需求。

内容的提问来源于stack exchange,提问作者Buddhika Ariyaratne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 08:36:04