JSF selectManyListbox 显示值绑定错误

Posted

技术标签:

【中文标题】JSF selectManyListbox 显示值绑定错误【英文标题】:JSF selectManyListbox shows error of value binding 【发布时间】:2017-02-07 10:31:39 【问题描述】:

我在 JSP 中使用 JSF 标记 h:selectManyListbox 来显示来自 bean 的项目列表。

<h:selectManyListbox value="#settingsBean.statusIds" style="width: 100%; height: 200px;">
    <f:selectItem value="#settingsBean.statusItems" />
</h:selectManyListbox>

statusItems 对象在以下 bean 类中定义:

SettingsBean.java

public class SettingsBean 
   private List<String> statusIds;
   private List<SelectItem> statusItems;

   public SettingsBean() 
       initStatus();
       

   private void initStatus() 
       statusItems = new ArrayList<SelectItem>();

       statusItems.add(new SelectItem("v1", "lbl1"));
       statusItems.add(new SelectItem("v2", "lbl2"));
       statusItems.add(new SelectItem("v3", "lbl3"));
   

   public ArrayList getStatusItems()
       return getStatusItemsList(false);
   

   @SuppressWarnings("unchecked")
   private ArrayList getStatusItemsList(boolean selected) 
       ArrayList ids = new ArrayList();     
       if (!selected) 
           boolean inSelIds = false;
           for (int i=0; i < statusItems.size(); i++) 
               inSelIds = false;
               SelectItem item = (SelectItem)statusItems.get(i);

               if (selected==inSelIds) 
                   String text = item.getLabel();                   
                   //ids.add(text);
                   ids.add(new SelectItem(item.getValue(), text));
               
           
       

       return ids;
   

但我在加载时收到一条错误消息:


HTTP Status 500 - java.lang.IllegalArgumentException: Value binding '#settingsBean.statusItems' of UISelectItem : Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /jsp/Settings.jsp][Class: javax.faces.component.html.HtmlSelectManyListbox,Id: _id3][Class: javax.faces.component.UISelectItem,Id: _id4] does not reference an Object of type SelectItem

我应该遗漏什么或导致此问题?谢谢你的帮助

【问题讨论】:

这是一种对象问题,您使用的是一种数据类型而不是其他类型的数据 【参考方案1】:

在 JSF 中,我们有两个不同的标签 selectItemselectItemsselectItem 用于显示单个项目,尽管我们可以使用多个 selectItem 标签来显示多个值。但是如果我们有一个selectItems 的列表,那么我们应该使用selectItems 而不是selectItem。所以用selectItems 替换XHTML 上的selectItem 标签,如下所示:

<h:selectManyListbox value="#settingsBean.statusIds" style="width: 100%; height: 200px;">
    <f:selectItems value="#settingsBean.statusItems" />
</h:selectManyListbox>

【讨论】:

@NJ Francisco:你是否为 statusIds 生成了 Setter/Getter?【参考方案2】:

您的绑定不太正确。在这种情况下,您需要使用 Collection 或 Array,如示例中所示: https://www.tutorialspoint.com/jsf/jsf_selectmanylistbox_tag.htm

此外,您应该考虑替换

中的 value="value" 属性
<f:selectItem value="#settingsBean.statusItems" />

收件人:

<f:selectItem itemValue="#settingsBean.statusItems" />

【讨论】:

以上是关于JSF selectManyListbox 显示值绑定错误的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0 和 selectManyListbox 中的生命周期问题

让 JSF 将 selectManyListbox 值的选定项设置为 List 或 Collection 而不是数组

带有转换器的 JSF selectManyListBox 不起作用

<f:selectItems> 未在 <h:selectManyListbox> 中呈现

提交后如何取消选择 h:selectManyListbox

h:selectmanyListbox 使“选择”选项在至少选择一个选项时无法选择