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}" />