Skip to content

JSF selectOneMenu and Converters

How to make a single select dropdown with selectOneMenu, using converted objects.

Section titled “How to make a single select dropdown with selectOneMenu, using converted objects.”

Create your converter class.

Make it accessible via the managed bean. I did this by adding a getter to my stock managed bean. Alternatively you could register your converter so it will work globally.

public class StockBean {
...
public ExchangeConverter getExchangeConverter() {
return exchangeConverter;
}
...
}

My StockBean is already registered under #{stockBean}. This means we can refer to the ExchangeConverter using #{stockBean.exchangeConverter}. The ExchangeConverter converts a String displayed by or sent to the browser to an Exchange. In this project an Exchange is a stock exchange, such as NYSE.

public class Exchange {
private String code;
public Exchange(String code) {
this.code = code;
}
public String getCode() {
return code;
}
}

Next, add the Exchange the user will pick into the managed bean.

public class StockBean {
// user selected fields
private Exchange exchange;
public void setExchange(Exchange exchange) {
this.exchange = exchange;
}
public Exchange getExchange() {
return exchange;
}
...
}

Now we need to generate the values the user can choose. The following method returns a List of javax.faces.model.SelectItem. These will be used in the dropdown or select box.

public class StockBean {
...
public List<SelectItem> getExchanges() {
List<SelectItem> selectItems = new ArrayList<SelectItem>();
List<Exchange> exchanges = exchangeService.getExchanges();
for (Exchange exchange : exchanges) {
SelectItem item = new SelectItem(exchange, exchange.getCode());
selectItems.add(item);
}
return selectItems;
}

When creating the SelectItems, make sure you set the value as your special type, not a String. In this case give the SelectItem the Exchange for the value.

Now we can add it to the form.

<h:selectOneMenu value="#{stockBean.exchange}" converter="#{stockBean.exchangeConverter}" >
<f:selectItems value="#{stockBean.exchanges}"/>
</h:selectOneMenu>

Check the converter is being passed the correct class for getAsString. If not, check the SelectItem’s value is the correct class.