Yurish
Yurish

Reputation: 1309

JSF - UISelectItems problem

Strange error i received from compiler:

Expected a child component type of UISelectItem/UISelectItems for component type javax.faces.SelectOne(siachoice).  Found javax.faces.component.UISelectItems.

So, if he was expecting UISelectItems, and found UISelectItems, then where is the error?

My JSP implementation:

<h:selectOneMenu id="siachoice" value="#{dbSelectBean.currentOption}">
                                <f:selectItems value="#{dbSelectBean.dbs}" />
                            </h:selectOneMenu>

Method, where i am setting UISelectItem to UISelectItems:

private UISelectItems populateDatabases(String databaseString) {
    UISelectItems selects = new UISelectItems();
    List<UISelectItem> result = new ArrayList<UISelectItem>();
    StringTokenizer tokeniz = new StringTokenizer(databaseString, GlobalConstants.DELIMITER);
    while(tokeniz.hasMoreTokens()){
        String tempDB = tokeniz.nextToken();
        UISelectItem item = new UISelectItem();
        item.setItemValue(tempDB);
        item.setItemLabel(tempDB);
        result.add(item);
    }
    selects.setValue(result);

    return selects;
}

Then, of course, i am setting it to the bean variable dbs.

Help?

Upvotes: 4

Views: 8783

Answers (4)

Abderrazek
Abderrazek

Reputation: 11

<h:form>
<h:selectOneListbox size="5"  >

<f:selectItems  value="#{userManager.Test()}" />
</h:selectOneListbox>
</h:form>

import javax.faces.model.SelectItem;
import tn.com.ttnproject.entity.*;

@Name("userManager")
@Scope(ScopeType.CONVERSATION)
public class UserManager {
    public  List <SelectItem> listAllUsersNames;
    SelectItem element;
    public List<SelectItem> Test(){ 
        listAllUsersNames = new ArrayList<SelectItem>();
        for (int i=1;i<=10;i++)
        {
            element=new SelectItem(
                new Integer(i),
                i+".00 euros",
                "Produit à "+i+".00 euros");
            listAllUsersNames.add(element);
        }
        return listAllUsersNames;
    }
}

Upvotes: 1

BalusC
BalusC

Reputation: 1108742

The <f:selectItems value="#{bean.items}" /> expects one of the following values:

public SelectItem[] getItems() {}

public List<SelectItem> getItems() {}

public Map<String, Object> getItems() {}

The commonly used one is indeed the List<SelectItem>.

Edit: as response to the comment: UISelectItem represents the <f:selectItem> component. The same applies to UISelectItems and <f:selectItems>. E.g.

<f:selectItem binding="#{bean.selectItem}" />
<f:selectItems binding="#{bean.selectItems}" />

which are bound as

private UISelectItem selectItem;
private UISelectItems selectItems;
// +getter +setter

this way you can control the components programmatically -as for every other UIComponent.

Upvotes: 4

Bozho
Bozho

Reputation: 597116

You must return a Collection of javax.faces.model.SelectItem

List list = new ArrayList();
list.add(new SelectItem(value, label));

return list;

Upvotes: 4

cetnar
cetnar

Reputation: 9415

The problem is UISelectItem is a component clas so it has to be paired with jsf tag by binding attribute. If you want to have pure values you have to use SelectItem(s) classes.

Upvotes: 0

Related Questions