JSF selectManyListbox показывает ошибку привязки значения

Я использую тег JSF h:selectManyListbox в JSP для отображения списка элементов из бина.

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

Объект statusItems определен в следующем классе бина:

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

Что я должен пропустить или вызвать эту проблему? Спасибо за помощь

2 ответа

Решение

В JSF у нас есть два разных тега selectItem а также selectItems, selectItem используется для отображения одного элемента, хотя мы можем использовать несколько selectItem теги для отображения нескольких значений. Но если у нас есть список selectItems тогда мы должны использовать selectItems скорее, чем selectItem, Так замените тебя selectItem пометьте на своем XHTML selectItems как ниже:

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

Ваше связывание не совсем правильно. В этом случае вам нужно использовать либо коллекцию, либо массив, как в примере: https://www.tutorialspoint.com/jsf/jsf_selectmanylistbox_tag.htm

Кроме того, вы должны рассмотреть заменить атрибут value="value" из

<f:selectItem value="#{settingsBean.statusItems}" />

Для того, чтобы:

<f:selectItem itemValue="#{settingsBean.statusItems}" />
Другие вопросы по тегам