Object in SelectItem

Hi!

I'm trying to use a SelectOneMenu component, but i have some problems. I want to populate the SelectOneMenu with a List of SelectItems. When i read the specification on the SelectItem it says that i can put in an object and a String as parameters. I have a Category object which i want to put in the SelectItem object. But it looks like it's not possible.

I want the selected item in the SelectOneMenu component to be accessed in the backing bean this way:

SelectItem si;

Category c=(Category)si.getValue();

Is that possible? If not, could anyone please tell me how it's done?

[620 byte] By [Ibbernika] at [2007-11-27 4:55:15]
# 1

The h:selectOneMenu works as follows:

JSF<h:form>

<h:selectOneMenu value="#{myBean.selectedItem}">

<f:selectItems value="#{myBean.selectItems}" />

</h:selectOneMenu>

<h:commandButton value="submit" action="#{myBean.action}" />

</h:form>

MyBeanprivate T selectedItem; // + getter + setter

private List<SelectItem> selectItems; // + getter

public void action() {

System.out.println(selectedItem); // The selected item is just filled by the JSF lifecycle.

}

public List<SelectItem> getSelectItems() {

if (selectItems == null) { // Do your preloading thing.

selectItems = new ArrayList<SelectItem>();

selectItems.add(new SelectItem(t1, "label1");

selectItems.add(new SelectItem(t2, "label2");

selectItems.add(new SelectItem(t3, "label3");

}

return selectItems;

}

Where the t1, t2, t3 are instances of the same object type T (in your case, the Category). If this object type has a human readable #toString() implementation which can represent the label, then you can leave the 2nd parameter of SelectItem away.

BalusCa at 2007-7-12 10:10:09 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 2

Thank you for your answer. When i try that solution, i get following message:

java.lang.IllegalArgumentException: Value is no String (class=dk.butikmarian.model.Kategori, value=noget) and component _idJsp0:_idJsp6with path: {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /adminKategori.jsp][Class: javax.faces.component.html.HtmlForm,Id: _idJsp0][Class: javax.faces.component.html.HtmlPanelGrid,Id: _idJsp2][Class: javax.faces.component.html.HtmlSelectOneMenu,Id: _idJsp6]} does not have a Converter

Do i need to create a converter or what does it mean?

Ibbernika at 2007-7-12 10:10:09 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 3
The object type (presented as T, t1, t2 and t3 in the above example) must fit in each other.
BalusCa at 2007-7-12 10:10:09 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...
# 4

Hmmm. I still can't get it to work. My code looks like:

Snippet from my jsf page:

<h:panelGrid columns="6">

<h:outputText value="#{msg.name}"/><h:inputText value="#{adminkategoribean.navn}"/>

<h:outputText value="#{msg.ocategory}"/>

<h:selectOneMenu value="#{adminkategoribean.tilfojItem}">

<f:selectItems value="#{adminkategoribean.list}" />

</h:selectOneMenu>

<h:commandButton actionListener="#{adminkategoribean.tilfoj}" value="#{msg.add}"/>

<h:outputText value="#{adminkategoribean.error1}" />

</h:panelGrid>

Snippet from my backing bean:

private List<SelectItem> list;

private Kategori tilfojItem;

private Kategori redigerItem;

private Kategori sletItem;

private Funktionalitet fkt;

public AdminKategoriBean(){

fkt=new Funktionalitet();

List l=fkt.fyldListe();

list= new ArrayList<SelectItem>();

for(int i=0;i<l.size();i++){

Kategori k=(Kategori)l.get(i);

list.add(new SelectItem(k,k.getKategorinavn()));

}

}

The fkt attribute is referenceing a domain layer class.

The method fkt.fyldListe() fill in Kategori objects from the database via hibernate.

There are getters and setters for all the attributes except the fkt attribute!

I get the following exception when i try to load the page:

java.lang.IllegalArgumentException: Value is no String (class=dk.butikmarian.model.Kategori, value=noget) and component _idJsp0:_idJsp6with path: {Component-Path : [Class: javax.faces.component.UIViewRoot,ViewId: /adminKategori.jsp][Class: javax.faces.component.html.HtmlForm,Id: _idJsp0][Class: javax.faces.component.html.HtmlPanelGrid,Id: _idJsp2][Class: javax.faces.component.html.HtmlSelectOneMenu,Id: _idJsp6]} does not have a Converter

org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:536)

org.apache.myfaces.shared_impl.renderkit.RendererUtils.getConvertedStringValue(RendererUtils.java:555)

org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderSelectOptions(HtmlRendererUtils.java:398)

org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.internalRenderSelect(HtmlRendererUtils.java:298)

org.apache.myfaces.shared_impl.renderkit.html.HtmlRendererUtils.renderMenu(HtmlRendererUtils.java:252)

org.apache.myfaces.shared_impl.renderkit.html.HtmlMenuRendererBase.encodeEnd(HtmlMenuRendererBase.java:54)

javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:536)

org.apache.myfaces.shared_impl.renderkit.RendererUtils.renderChild(RendererUtils.java:442)

org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.renderChildren(HtmlGridRendererBase.java:216)

org.apache.myfaces.shared_impl.renderkit.html.HtmlGridRendererBase.encodeEnd(HtmlGridRendererBase.java:98)

javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:536)

javax.faces.webapp.UIComponentTag.encodeEnd(UIComponentTag.java:495)

javax.faces.webapp.UIComponentTag.doEndTag(UIComponentTag.java:363)

org.apache.myfaces.shared_impl.taglib.UIComponentBodyTagBase.doEndTag(UIComponentBodyTagBase.java:54)

org.apache.jsp.adminKategori_jsp._jspx_meth_h_005fpanelGrid_005f0(adminKategori_jsp.java:275)

org.apache.jsp.adminKategori_jsp._jspx_meth_h_005fform_005f0(adminKategori_jsp.java:174)

org.apache.jsp.adminKategori_jsp._jspx_meth_f_005fview_005f0(adminKategori_jsp.java:138)

org.apache.jsp.adminKategori_jsp._jspService(adminKategori_jsp.java:86)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:416)

org.apache.myfaces.application.jsp.JspViewHandlerImpl.renderView(JspViewHandlerImpl.java:234)

org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:384)

javax.faces.webapp.FacesServlet.service(FacesServlet.java:138)

org.apache.jasper.runtime.PageContextImpl.doForward(PageContextImpl.java:691)

org.apache.jasper.runtime.PageContextImpl.forward(PageContextImpl.java:661)

org.apache.jsp.index_jsp._jspService(index_jsp.java:46)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:328)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:315)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

thanks for your help>

Ibbernika at 2007-7-12 10:10:09 > top of Java-index,Enterprise & Remote Computing,Web Tier APIs...