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>Troubleshooting
Section titled “Troubleshooting”Check the converter is being passed the correct class for getAsString. If not, check the
SelectItem’s value is the correct class.